Это может зависеть от случая; например, если вы потребляете событие из библиотеки DLL, написанной в C# с помощью «полей типа события», т.е.
public event EventHandler SomeEvent; // synchronized
(да, я знаю, что вы спрашивали о VB, я объясню это ниже ...)
, то это (в соответствии с спецификацией языка C#) автоматически синхронизируется, поэтому нет многопоточных проблем (и здесь он помогает в том, что делегаты неизменяемы). Однако, даже в той же библиотеке, не-поля как событие может не быть синхронизированы - т.е.
private EventHandler myField;
public event EventHandler SomeEvent { // not synchronized
add { myField += value; }
remove { myField -= value; }
}
Я знаю, что вопрос о VB ... но вы спрашиваете о VB как comsumer , Я хочу сказать, что это зависит от издателя.
Так что, если вы не можете контролировать издатель, а затем вручную синхронизирующие звуки целебного если вы думаете, что есть многопоточность риски для данного сценария (в большинстве случаев, нет необходимости синхронизировать, но если вы знаете, это - это резьбовая область, тогда синхронизация разумна).
Также обратите внимание, что общая картина, когда повышение событие является, чтобы сделать снимок:
protected virtual void OnSomeEvent() {
EventHandler handler = SomeEvent; // assume the "field-like" version
if(handler!=null) handler(this, EventArgs.Empty);
}
Моя точка здесь является то, что она в теории возможно абонент получить событие даже после того, как они думают, что они отказались от подписки, поэтому, если в крайних случаях вы, возможно, захотите справиться с этим вручную, возможно, где-то там где-нибудь (или просто обработкой исключений).
В соответствии с просьбой, последний фрагмент кода в VB (с помощью рефлектора) для сравнения:
Protected Overridable Sub OnSomeEvent()
Dim handler As EventHandler = Me.SomeEvent
If (Not handler Is Nothing) Then
handler.Invoke(Me, EventArgs.Empty)
End If
End Sub
Великого поста. Вы поднимаете очень хороший момент. В этом случае моя программа действительно является производителем, а также потребителем. Мой C# очень ржавый на данный момент, так что есть ли шанс, что вы могли бы перевести последний бит кода, который вы отправили в VB.Net? –
Я переведу через отражатель и пост ... –
Спасибо вам. Опять же, отличный ответ. –