如何在C#中使用BackgroundWorker类使用多线程?

时间:2012-09-11 19:01:58

标签: c# multithreading backgroundworker

我读到了使用BackgroundWorker类在Windows窗体应用程序中实现线程。我有一个小问题:如果我想要同时运行5个线程来处理指定的任务,我必须创建5个BackgroundWorker控件或只需要一个?

2 个答案:

答案 0 :(得分:1)

如果你只是在谈论BackgroundWorker,那么你必须创建5个背景工作者。如果你只想要5个线程,你可以自己创建。然后问题变成如何将进度和完成传回UI线程。使用BackgroundWorker,您可以使用WorkerReportsProgress / ReportProgress和已完成的事件执行此操作。现在,您可以某些只是使用BackgroundWorker DoWork处理程序来生成您想要的线程,并通过{{1}管理从这些线程到UI线程的数据通信}和ReportProgress

例如:

Completed

当然,这对进步没有任何作用 - 这将是非常具体的应用程序,我想出的任何东西都可能完全不同于你会做的事情,并没有任何帮助。但是,每个线程都可以直接通过private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { Thread thread1 = new Thread(ThreadOneEntry); thread1.Start(); Thread thread2 = new Thread(ThreadTwoEntry); thread2.Start(); Thread thread3 = new Thread(ThreadThreeEntry); thread3.Start(); Thread thread4 = new Thread(ThreadFourEntry); thread4.Start(); Thread thread5 = new Thread(ThreadFiveEntry); thread5.Start(); thread1.Join(); thread2.Join(); thread3.Join(); thread4.Join(); thread5.Join(); // do something to report results from threads1-5 } 方法报告进度 - 您只需要为每个线程提供BackgroundWorker.ReportProgress个实例或委托给BackgroundWorker方法。

对于后台工作者来说,它也不是一个非常有效的线程使用,它只是进入等待其他线程的等待状态,ReportProgress事件处理程序可以轻松地做一些其中一个工作其他线程条目将有......

如果您使用的是.NET 3.5或更高版本,并且您希望执行具有结果的后台工作,我建议您使用DoWork而不是Task<T>。另外,启动自己的线程不会产生负载平衡。通过TPL的任务可以自己进行负载平衡......

答案 1 :(得分:0)

BackgroundWorker基本上是一个单独的线程,因此如果您需要运行多个线程,则需要多个实例。