BackgroundWorker是否提供真正的多线程?

时间:2010-02-13 13:39:38

标签: .net wpf multithreading backgroundworker

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

如果我不仅希望在UI场景后面有一个线程工作,而且可能需要多个线程,从而彼此独立地开始和结束,那么BackgroundWorker是否适合这种情况?我可以有多个BackgroundWorker实例吗?

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

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分:3)

您引用的限制(来自Pro WPF)源于BGW使用ThreadPool这一事实,因此所有关于ThreadPool线程的rules and adivice都适用。

答案 2 :(得分:2)

如果您创建了许多BackgroundWorker个实例,那么您将获得许多线程,但是单个实例仅提供单个后台任务。

答案 3 :(得分:0)

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