2011-03-02 24 views
1

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

当事件在所提到的类中引发时,是否有适当的方法来处理这种情况?

回答

2

您必须在UI线程上更新UI对象。您可以使用窗口的调度,以执行代码有:

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

谢谢,我知道这一个,反正是有,我可以从类本身主线程提高的情况下,我的意思是我希望类的用户(wpf)能够像其他事件一样处理事件 – Mehrshad 2011-03-03 00:10:30

+0

关于事件有三件事:它引发的线程,发件人对象和事件参数。您可以提供所需的任何发件人和事件参数,如果您希望在UI线程中引发该事件,则可以在调度程序方法内触发该事件。 – RandomEngy 2011-03-26 15:58:00

2

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

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