处理从后台线程引发的事件

时间:2011-03-02 22:00:31

标签: events c#-4.0 multithreading

我开发了一个用于通过网络发送和接收消息的类(在C#中)。它创建一个新线程(侦听器线程),等待新消息到达然后引发事件。 问题是在侦听器线程中引发了事件,当我想在wpf应用程序中使用此类时,尝试处理事件时发生运行时错误 错误是:调用线程无法访问此对象,因为另一个线程拥有它。

当上述课程中的事件发生时,有没有正确的方法来处理这种情况?

2 个答案:

答案 0 :(得分:2)

BackgroundWorker显式支持封送到UI线程。你必须使用它,调用它的ReportProgress()方法。虽然针对报告进度进行了优化,但您并没有 来使用它。有一个接受对象的重载,你可以传递你想要的任何东西。事件处理程序将其作为e.UserState值获取。从那里,您可以直接使用该对象,或者使用它来重新引发另一组事件。

请注意该对象的线程安全要求。工作程序继续运行,并且以任何方式与ProgressChanged事件处理程序的执行同步。所以它不应该再更新对象。最好在调用ReportProgress()后创建它的新实例。

答案 1 :(得分:2)

您必须在UI线程上更新UI对象。您可以使用窗口的Dispatcher在那里执行代码:

this.Dispatcher.Invoke(new Action(() =>
{
    // Code that updates UI here
}));