VB.NET RaiseEvent,线程安全?
线程安全吗 用C写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
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问题。