如何在 C# 中引发事件 - 最佳方法

HJ.*_*HJ. 5 c# event-handling

我正在编写一个 Windows 窗体应用程序。它有一个线程来执行某些操作,当操作发现某些内容时,它必须通知主窗体更改控件。

目前,通知使用以下 MSDN 页面中描述的 C# 事件处理: http://msdn.microsoft.com/en-us/library/wkzf914z (VS.71).aspx

但我不确定代表的情况。由于在我上面描述的情况下,线程调用委托。这是引发事件的线程安全方法吗?

在 C# 中实现 Windows Messages( SendMessage) 然后在WindowProc.

Jos*_*osh 7

除非您需要对线程进行非常精细的控制,否则您可以使用BackgroundWorker。它为您处理所有跨线程通信。您基本上将后台代码放入其 DoWork 事件处理程序中,然后通过其 ProgressChanged 和 RunWorkerCompleted 事件将数据传递回 UI 线程。上面的链接有一个完整的示例,说明如何使用它。

但一般来说,只要遵循一些基本准则,简单地添加事件处理程序和引发事件就是线程安全的。但是,事件处理程序将在与引发事件的代码相同的线程上调用。事件处理代码可能不希望在后台线程上调用,因此这就是BackgroundWorker 派上用场的地方。

以下是一个以线程安全方式引发事件的类的非常基本的骨架。处理事件的代码是否是线程安全的完全是另一回事。

class MyClass {

    public event EventHandler SomethingHappened;

    protected virtual void OnSomethingHappened(EventArgs e) {
        EventHandler handler = SomethingHappened;
        if (handler != null) {
            handler(this, e);
        }
    }

    public void DoSomething() {
        OnSomethingHappened(EventArgs.Empty);
    }

}
Run Code Online (Sandbox Code Playgroud)