我正在编写一个 Windows 窗体应用程序。它有一个线程来执行某些操作,当操作发现某些内容时,它必须通知主窗体更改控件。
目前,通知使用以下 MSDN 页面中描述的 C# 事件处理: http://msdn.microsoft.com/en-us/library/wkzf914z (VS.71).aspx
但我不确定代表的情况。由于在我上面描述的情况下,线程调用委托。这是引发事件的线程安全方法吗?
在 C# 中实现 Windows Messages( SendMessage) 然后在WindowProc.
除非您需要对线程进行非常精细的控制,否则您可以使用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)