RaiseEvent线程安全吗?
在C#中您可以编写
if (event != null)
{
event.invoke();
}并且C#代码不是线程安全的……
发布于 2010-01-08 16:56:49
如果我需要做线程安全事件,我会这样写:
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如果你使用Reflector,你可以观察到大多数线程安全控件都使用类似的系统。
发布于 2010-01-08 16:40:53
在C#中,你可以这样写:
EventHandler h= myEvent;
if (h!=null)
h(...);这避免了明显的问题(即测试和调用之间的取消订阅),但这也不是线程安全的。
调用事件意味着侦听器已准备好处理此事件。这在很大程度上取决于您的特定情况,通常是通过使用同步机制来实现的。
你说的“线程安全”到底是什么意思?
https://stackoverflow.com/questions/2026355
复制相似问题