0

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

4

2 回答 2

1

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

例如:

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 进行自己的负载平衡......

于 2012-09-11T20:55:13.923 回答
0

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

于 2012-09-11T19:13:06.580 回答