2010-01-08 42 views
1

RaiseEvent線程安全嗎?VB.NET RaiseEvent,線程安全?

在C#編寫

if (event != null) 
{ 
    event.invoke(); 
} 

和C#代碼不是線程安全....

+3

在此上下文中定義「線程安全」。你的意思是,「事件」可以安全使用兩次?或者,「事件可以安全地調用當前線程」,或者......? – 2010-01-08 08:47:27

回答

2

如果我需要做的線程安全的事件,我寫這篇文章:

Class Test 

    Public Event Click(ByVal sender As Object, ByVal e As EventArgs) 
    Public Event MouseIn(ByVal sender As Object, ByVal e As EventArgs) 

    Private Delegate Sub EventArgsDelegate(ByVal e As EventArgs) 
    Private ReadOnly _parent As Control 

    Public Sub New(ByVal parent As Control) 
     _parent = parent 
    End Sub 

    Private Sub OnClick(ByVal e As EventArgs) 

     If _parent.InvokeRequired Then 
      _parent.Invoke(New EventArgsDelegate(AddressOf OnClick), e) 
     Else 
      RaiseEvent Click(Me, e) 
     End If 

    End Sub 

    Private Sub OnMouseIn(ByVal e As EventArgs) 

     If _parent.InvokeRequired Then 
      _parent.Invoke(New EventArgsDelegate(AddressOf OnMouseIn), e) 
     Else 
      RaiseEvent MouseIn(Me, e) 
     End If 

    End Sub 

End Class 

然後每當我需要提高的情況下我只是用OnClick(new eventargs(...))等,如果你使用Reflector你可以觀察到,大多數線程安全控制使用類似的系統。

+0

是否有選擇代表的原因而不是'_parent.invoke(sub()OnClick(e))'? – Basic 2012-02-02 08:23:16

+0

@Baisc:我唯一的原因是作爲lambda的'Sub()'不支持所有版本的vb.net,這是。 – Pondidum 2012-02-03 08:11:54

+0

好點,做得很好 - 出於某種原因,我認爲這是一個'.Net-4.0'的問題。 – Basic 2012-02-03 09:49:23

2

在C#中,而寫:

EventHandler h= myEvent; 
if (h!=null) 
    h(...); 

這就避免了明顯的問題(即在測試和調用之間取消訂閱),但這也不是線程安全的。

調用事件意味着偵聽器已準備好處理此事件。這很大程度上取決於您的具體情況,通常通過使用同步機制來實現。

「線程安全」是什麼意思?