除非您需要对线程进行非常好的控制,否则可以使用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);
}
}
您使用的是.NET 1.1吗?如果没有,那么你不应该使用.NET 1.1文档。改为使用http://msdn.microsoft.com/en-us/library/wkzf914z.aspx。 – 2010-06-22 05:04:16