首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.NET RaiseEvent,线程安全?

VB.NET RaiseEvent,线程安全?
EN

Stack Overflow用户
提问于 2010-01-08 16:38:02
回答 2查看 4K关注 0票数 1

RaiseEvent线程安全吗?

在C#中您可以编写

代码语言:javascript
复制
if (event != null)
{
    event.invoke();
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-08 16:56:49

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

代码语言:javascript
复制
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,你可以观察到大多数线程安全控件都使用类似的系统。

票数 2
EN

Stack Overflow用户

发布于 2010-01-08 16:40:53

在C#中,你可以这样写:

代码语言:javascript
复制
EventHandler h= myEvent;
if (h!=null)
   h(...);

这避免了明显的问题(即测试和调用之间的取消订阅),但这也不是线程安全的。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2026355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档