2012-10-24 52 views
0

读这些BackgroundWorker vs. ThreadPool vs. Thread提示,我决定用BackgroundWorker去。创建多个(超过10个)BackgroundWorkers的建议方法是什么?

我知道如何通过从工具箱拖放它的组件到我的窗体中来创建这样的线程,但是因为我需要多个这样的线程(有限数字在10-20之间),所以我不确定什么是解决这个正确的方法是:

  • 拖放他们10-20,代码为他们创造的占位符,但只启动那些需要运行,根据应用需求(在不同情况下,我可以为运行这些10-20线程中的1-2个我们)。

我喜欢拖和下降的方法,但我不是BackgroundWorker的经历,我不知道这种权衡可能是什么。

来自有经验的BackgroundWorker程序员的任何提示?

+4

您是否也考虑过任务(.NET 4)? –

+0

@Mudu没有任何优于BackgroundWorkers的优势? – ateiob

+2

这将有助于了解工人会做什么。 –

回答

1

您可以创建一个包含它们的数组。为每个你添加一个处理程序。完成后,通过数组来处置它们。例如(抱歉,这是从VB代码翻译,我不是专家在C#所以请伪代码在最坏的情况都把):

//globally 
List<BackgroundWorker> workers = new List<BackgroundWorker>(); 

//within a sub/function 
int numberOfWorkersNeeded = 10; 
for (i = 0; i < numberOfWorkersNeeded; i++) { 
    BackgroundWorker bg = new BackgroundWorker(); 
    bg.DoWork += new DoWorkEventHandler(MyWorkHandler); 
    bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(MyWorkFinishedHandler); 
    workers.Add(bg); 
} 

要删除(它们是可重复使用,所以这是当退出或当您不需要再工人):

for (i = 0; i < workers.Count; i++) { 
    if (!bg.IsBusy) { 
     //remove handlers 
     workers(i).Dispose(); 
    } 
} 

权衡作为@ateiop说,你需要手动创建(和删除)的事件处理程序。

对于BackgroundWorker您有两个主要事件DoWorkRunWorkerCompleted。另外,如果您想报告进度,则需要启用报告(bg.WorkerReportsProgress = true;)并为其添加处理程序(ProgressChanged)。

无论如何,您还需要处理尚未完成的工作。

+4

奇怪的C#和VB在这里混合.... – Servy

+0

抱歉,由vb翻译。 – K3N

+0

+1代表实际的代码示例以编程方式创建BackgroundWorkers。这也许是被接受的答案(除非有更好的结果),但是我喜欢拖放方法,您可以通过双击来定义/访问其所有事件处理程序。在这里,我不知道我是否错过了什么? – ateiob

相关问题