学习构建多线程WPF应用程序我读到了使用BackgroundWorker的一些限制,这对我来说并不是很清楚。请帮助我理解:
如果我不仅希望在UI场景后面有一个线程工作,而且可能需要多个线程,从而彼此独立地开始和结束,那么BackgroundWorker是否适合这种情况?我可以有多个BackgroundWorker实例吗?
简单地说,BackgroundWorker是否提供多线程而不仅仅是双线程?
答案 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中的线程池中。