我是否需要实现后台工作者

时间:2012-03-13 14:51:59

标签: c# multithreading backgroundworker

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

由于

2 个答案:

答案 0 :(得分:1)

从您的描述中可以看出,您将从多线程中受益,因为它有助于保持UI响应。

最简单的方法是使用BackgroundWorker。首先完成one of the many samples,然后咬紧牙关,如果你有任何问题,请回到这里。

回应评论:

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

这会导致在主线程上引发BackgroundWorker.ProgressChanged事件 - 并且可以在不需要显式Invoke的情况下处理数据。

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

答案 1 :(得分:0)

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

由于另一个线程无法更新UI,因此您应该将这些事件的代码包装在this.Invoke()上。

例如:

private void TheEventRaisedOnAnotherThread(object sender, EventArgs e)
{
    _counter++;
    this.Invoke(new MethodInvoker(delegate() { TextBox1.Text = _counter.ToString(); }));
}