VB.NET RaiseEvent,线程安全?

时间:2010-01-08 08:38:02

标签: vb.net thread-safety

RaiseEvent线程是否安全?

在C#中你写了

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

并且C#代码不是线程安全的....

2 个答案:

答案 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,您可以观察到大多数线程安全控件使用类似的系统。