创建多个(超过10个)BackgroundWorkers的推荐方法是什么?

时间:2012-10-24 16:26:20

标签: c# winforms backgroundworker

阅读这些BackgroundWorker vs. ThreadPool vs. Thread提示,我决定选择BackgroundWorker

我知道如何通过将其组件从工具箱拖放到我的表单中来创建这样的线程,但由于我需要多个这样的线程(10-20之间的有限数字),我不确定是什么正确解决这个问题的方法是:

  • 拖放10-20个,在代码中为它们创建占位符,但只启动那些需要运行的占位符,具体取决于应用程序的需求(在不同的场景中,我可以运行少至1-2的那些10- 20个主题)。

我更喜欢拖放式方法,但我在BackgroundWorker中没有经验,我不确定可以做出哪些权衡。

经验丰富的BackgroundWorker程序员的任何提示?

1 个答案:

答案 0 :(得分: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)。

在任何情况下,您还需要处理尚未完成的工作人员。