2009-07-25 56 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

相關問題