Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET RaiseEvent,线程安全?_Vb.net_Thread Safety - Fatal编程技术网

VB.NET RaiseEvent,线程安全?

VB.NET RaiseEvent,线程安全?,vb.net,thread-safety,Vb.net,Thread Safety,线程安全吗 用C写 if (event != null) { event.invoke(); } 而且C代码不是线程安全的….在C中,您可以编写: EventHandler h= myEvent; if (h!=null) h(...); 这避免了明显的问题,即在测试和调用之间取消订阅,但这也不是线程安全的 调用事件意味着侦听器已准备好处理此事件。这在很大程度上取决于您的具体情况,通常通过使用同步机制来实现 你说的线程安全到底是什么意思?在C中,你宁愿写: EventHandl

线程安全吗

用C写

if (event != null)
{
    event.invoke();
}
而且C代码不是线程安全的….

在C中,您可以编写:

EventHandler h= myEvent;
if (h!=null)
   h(...);
这避免了明显的问题,即在测试和调用之间取消订阅,但这也不是线程安全的

调用事件意味着侦听器已准备好处理此事件。这在很大程度上取决于您的具体情况,通常通过使用同步机制来实现

你说的线程安全到底是什么意思?

在C中,你宁愿写:

EventHandler h= myEvent;
if (h!=null)
   h(...);
这避免了明显的问题,即在测试和调用之间取消订阅,但这也不是线程安全的

调用事件意味着侦听器已准备好处理此事件。这在很大程度上取决于您的具体情况,通常通过使用同步机制来实现


你所说的线程安全到底是什么意思?

如果我需要执行线程安全事件,我会这样写:

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

然后,每当我需要引发事件时,我只使用OnClicknew eventargs…,等等。如果使用,您可以观察到大多数线程安全控件都使用类似的系统。

如果我需要执行线程安全事件,我写以下内容:

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

然后,每当我需要引发事件时,我只使用OnClicknew eventargs…,等等。如果使用,您可以观察到大多数线程安全控件都使用类似的系统。

在此上下文中定义线程安全。你的意思是说,事件可以安全使用两次吗?或者,事件可以安全地调用当前线程,或者…?在此上下文中定义线程安全。你的意思是说,事件可以安全使用两次吗?或者,在当前线程上调用事件是安全的,或者…?您选择委托而不是_parent.invokesub OnClicke有什么特别的原因吗?@Baisc:我唯一的原因是vb.net的所有版本都不支持将Sub作为lambda,这是。这一点很好,做得很好-出于某种原因,我原以为这是一个.Net-4.0问题。你选择委托而不是“parent.invokesub OnClicke”有什么特别的原因吗?@Baisc:我唯一的原因是在vb.Net的所有版本中都不支持作为lambda的Sub。这是一个很好的观点,做得很好-出于某种原因,我认为这是一个.Net-4.0问题。