BackgroundWorker提供真正的多线程吗?

5

学习构建多线程WPF应用程序时,我读到了一些关于使用BackgroundWorker的限制,但对我来说并不是很清楚。请帮助我理解:

如果我想要不仅有一个线程在UI后台运行,而是可能有几个线程,彼此独立地启动和结束,那么BackgroundWorker适用吗?我可以有多个BackgroundWorker实例吗?

简单地说,BackgroundWorker是否提供了多线程而不仅仅是两个线程?


你有读到限制条款的链接吗? - Mark Byers
例如,来自Matthew MacDonald的《Pro WPF in C# 2008》一书中的这段文字: “注意:如果您有一个单独的异步任务需要从开始到结束在后台运行(可选支持进度报告和取消),那么BackgroundWorker是完美的。如果您有其他想法 - 例如,在整个应用程序生命周期内运行的异步任务或在执行其工作时与应用程序通信的异步任务,您将需要使用.NET的线程支持设计定制解决方案。” - rem
1
我认为这更多是关于什么被视为良好设计的问题,而不是技术上可能的问题。你可以创建许多BackgroundWorkers,但这可能不是解决问题的最佳方式。 - Mark Byers
4个回答

11
每个BackgroundWorker都在单独的线程上运行。您可以创建尽可能多的后台工作器,以并行地运行操作,因此从这个意义上说,它是真正的多线程。 BackgroundWorker的好处在于,当耗时任务完成时,您可以轻松订阅事件,该事件将在UI线程上触发。
实际上,使用BackgroundWorker非常简单:
var worker1 = new System.ComponentModel.BackgroundWorker();
worker1.DoWork += (sender,e) => Thread.Sleep(10000);
worker1.RunWorkerCompleted += (sender,e) => MessageBox.Show("Worker1 Finished!");
worker1.RunWorkerAsync();

3
您引用的限制(来自Pro WPF)源于BGW使用线程池,因此所有关于线程池线程的规则和建议都适用。请参考这里了解更多信息。

感谢提供有用的信息和链接 +1 - rem

2
如果您创建多个BackgroundWorker实例,则会得到许多线程,但是单个实例仅提供单个后台任务。

0

是的,内部,后台工作者会在您提供的委托上调用BeginInvoke。这将导致您的委托被放置在CLR中的线程池中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接