Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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
C# 我需要实现后台工作程序吗_C#_Multithreading_Backgroundworker - Fatal编程技术网

C# 我需要实现后台工作程序吗

C# 我需要实现后台工作程序吗,c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,我有一个主GUI应用程序,它在引用的程序集中完成所有实际工作。现在,我不在后台工作程序中工作,所以它基本上在处理时锁定主UI。在我引用的assmbly中,我添加了许多事件,以向主UI表单报告不同的进度。在主UI表单上,我用这些事件的值更新不同的文本框。我的问题是,首先,抛出这些事件时,处理速度似乎慢得多。那么,我应该在次线程(从引用的程序集)上触发事件吗?我对引用(静态)的原始调用应该是通过后台工作程序进行的吗?我想在一个单独的线程上报告不同类型的进度,只是不确定采用哪种方法来获得最佳性能 谢谢

我有一个主GUI应用程序,它在引用的程序集中完成所有实际工作。现在,我不在后台工作程序中工作,所以它基本上在处理时锁定主UI。在我引用的assmbly中,我添加了许多事件,以向主UI表单报告不同的进度。在主UI表单上,我用这些事件的值更新不同的文本框。我的问题是,首先,抛出这些事件时,处理速度似乎慢得多。那么,我应该在次线程(从引用的程序集)上触发事件吗?我对引用(静态)的原始调用应该是通过后台工作程序进行的吗?我想在一个单独的线程上报告不同类型的进度,只是不确定采用哪种方法来获得最佳性能


谢谢

您可以在不同的线程上启动进程(另一个程序集上的方法),并在主窗体上处理它引发的事件

由于UI不能由其他线程更新,因此应将这些事件的代码包装在this.Invoke()上

例:


根据您的描述,听起来您将受益于多线程,因为它将有助于保持UI的响应性

最简单的方法是使用后台工作人员。从工作开始,然后咬紧牙关,如果你有任何问题就回来

回应评论:

从BackgroundWorker工作线程到主线程的最佳通信方式是调用
BackgroundWorker.ReportProgress
方法,该方法采用可选的对象参数
userState
,您可以使用该参数打包要通信的数据

这会在主线程上引发
BackgroundWorker.ProgressChanged
事件,并且无需显式调用
即可处理数据


如果你已经实现了事件,你要么需要做一些返工来调用
ReportProgress
,而不是引发事件,要么实现某种适配器来处理事件并将它们路由到
ReportProgress
方法调用。

谢谢@Joe,我对BackgroundWorker或多线程没有问题,但我想我更好奇的是,如果引用的程序集职责是通过BackgroundWorker启动的,并且它们触发的静态事件是从BackgroundWorker的线程触发的,那么调用表单是在主UI线程上接收它们,还是在后台线程上接收它们?谢谢@matap,所以我只设置了一个辅助线程来调用我的“ReferencedAssembly.Go()”方法。然后ReferencedAssembly类引发的事件将通过主UI线程接收,对吗?辅助线程又名BackgroundWorkering如果调用ReferencedAssembly。在新线程上,其事件将在新线程上执行,而不是在主UI线程上执行。这就是为什么您应该使用this.Invoke()更新UI。
private void TheEventRaisedOnAnotherThread(object sender, EventArgs e)
{
    _counter++;
    this.Invoke(new MethodInvoker(delegate() { TextBox1.Text = _counter.ToString(); }));
}