2009-07-25 104 views
1

当使用ReadWriteLockSlim进行多线程支持时,使用AddHandler时是否需要EnterWriteLock?使用AddHandler时,是否需要EnterWriteLock?

这里有两个例子来帮助说明我的观点:

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

- 或 -

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

回答

2

这可能取决于该事件;例如,如果你是消费从通过“场式的事件”写在C#中的DLL

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 。我的意思是,这取决于发行人

所以,如果你无法控制的出版商,然后手动同步声音adviseable 如果你认为有这种情形的线程风险(在大多数情况下,没有必要进行同步,但如果你知道这是一个螺纹区域,然后同步是明智的)。

还要注意的是,当提高事件的常见模式是拍摄快照:

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的最后一段代码? – 2009-07-25 22:29:46

相关问题