Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 处理从后台线程引发的事件_Events_C# 4.0_Multithreading - Fatal编程技术网

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

Events 处理从后台线程引发的事件,events,c#-4.0,multithreading,Events,C# 4.0,Multithreading,我开发了一个类(C#)用于通过网络发送和接收消息。它创建一个新线程(侦听器线程),等待新消息到达,然后引发事件。 问题是该事件是在侦听器线程中引发的,当我想在wpf应用程序中使用该类时,在尝试处理该事件时会发生运行时错误 错误是:调用线程无法访问此对象,因为其他线程拥有它 在所提到的类中引发事件时,是否有适当的方法来处理这种情况?BackgroundWorker明确支持封送到UI线程。但是您必须使用它,调用它的ReportProgress()方法。虽然针对报告进度进行了优化,但您不必使用它。有一

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


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

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


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

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


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

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

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

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

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

谢谢,我知道这一点,不管怎样,我是否可以从类本身在主线程中引发事件,我的意思是,我希望类(wpf)的用户能够像处理其他事件一样处理事件。事件有三个方面:引发的线程、发送方对象和事件参数。你可以给出你想要的任何发送者和事件参数,如果你想在UI线程上引发事件,你可以在dispatcher方法中触发事件。谢谢,我知道这一点,我是否可以从类本身在主线程中引发事件,我的意思是我想要类的用户(wpf)为了能够像处理其他事件一样处理事件,事件有三个方面:引发事件的线程、发送方对象和事件参数。您可以提供所需的任何发送方和事件参数,如果希望在UI线程上引发事件,则可以在dispatcher方法内触发该事件。