答案 0 :(得分:2)
在C#中你宁愿写:
EventHandler h= myEvent;
if (h!=null)
h(...);
这避免了明显的问题(即测试和调用之间的取消订阅),但这也不是线程安全的。
调用事件意味着侦听器已准备好处理此事件。这在很大程度上取决于您的具体情况,通常通过使用同步机制来实现。
“线程安全”究竟是什么意思?
答案 1 :(得分: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,您可以观察到大多数线程安全控件使用类似的系统。