我阅读了有关使用 BackgroundWorker 类在 Windows 窗体应用程序中实现线程的信息。我有一个小问题:如果我想让 5 个线程同时运行来处理指定的任务,我必须创建 5 个 BackgroundWorker 控件还是只需要一个?
2 回答
如果您只是在谈论BackgroundWorker
,那么您必须创建 5 个背景工作人员。如果您只需要 5 个线程,您可以自己创建这些线程。然后问题变成了如何将进度和完成传达回 UI 线程。使用BackgroundWorker
,您可以使用WorkerReportsProgress
/ReportProgress
和 Completed 事件来执行此操作。现在,您可以确定只使用处理程序来生成您想要的线程,并通过和BackgroundWorker
DoWork
管理从这些线程返回 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
。
它也不是非常有效地使用后台工作线程的线程,它只是进入等待其他线程的等待状态,DoWork
事件处理程序可以轻松地完成其他线程条目之一的一些工作。 .
如果您使用 .NET 3.5 或更高版本并且想要执行有结果的后台工作,我建议您使用Task<T>
而不是。Thread
另外,启动您自己的线程不会进行负载平衡。任务通过 TPL 进行自己的负载平衡......
BackgroundWorker 基本上是一个线程,因此如果您需要运行多个线程,则需要多个实例。