2009-07-25 4 views
1

При использовании ReadWriteLockSlim для многопоточной поддержки мне нужно использовать EnterWriteLock при использовании AddHandler?Нужно ли вводить EnterWriteLock при использовании AddHandler?

Вот два примера, чтобы проиллюстрировать мою точку зрения:

AddHandler ClassInstance.Event, New EventHandler(AddressOf Me.Method) 

-или-

Me.ReaderWriterLockSlimInstance.EnterWriteLock() 
AddHandler ClassInstance.Event, New EventHandler(AddressOf Me.Method) 
Me.ReaderWriterLockSlimInstance.ExitWriteLock() 

ответ

2

Это может зависеть от случая; например, если вы потребляете событие из библиотеки 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 
+0

Великого поста. Вы поднимаете очень хороший момент. В этом случае моя программа действительно является производителем, а также потребителем. Мой C# очень ржавый на данный момент, так что есть ли шанс, что вы могли бы перевести последний бит кода, который вы отправили в VB.Net? –

+0

Я переведу через отражатель и пост ... –

+0

Спасибо вам. Опять же, отличный ответ. –

Смежные вопросы