我读到了使用BackgroundWorker类在Windows窗体应用程序中实现线程。我有一个小问题:如果我想要同时运行5个线程来处理指定的任务,我必须创建5个BackgroundWorker控件或只需要一个?
答案 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基本上是一个单独的线程,因此如果您需要运行多个线程,则需要多个实例。