2

所以我使用循环创建了多个 BackgroundWorker:

  foreach (var item in list)
  {
    worker = new BackgroundWorker();
    worker.DoWork += worker_DoWork;
    worker.RunWorkerAsync(item);
  }

现在我只是不知道如何检查所有这些工人是否完成了工作?

谢谢。

4

2 回答 2

2

您可以保留一个活跃工作人员列表,并让每个工作人员在完成后自行删除:

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

...

  foreach (var item in list)
  {
    worker = new BackgroundWorker();
    worker.DoWork += worker_DoWork;
    workers.Add(worker);
    worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
    {
        BackgroundWorker worker = (BackgroundWorker)s;
        workers.Remove(worker);
    }
    worker.RunWorkerAsync(item);
  }

...

public bool IsWorkDone
{
    get { return workers.Count == 0; }
}

如果您不想合并 IsWorkDone,则可以在workers.Remove(worker)列表为空之后引发事件...

于 2012-06-08T11:11:57.067 回答
1

假设workers是代表工人列表的变量,_completedWorkersCount是完成工作的工人的数量......

    worker.RunWorkerCompleted +=
    (o, e) =>
     {
         _completedWorkersCount = workers.Where(w => !w.IsBusy).Count();
     };         
于 2012-06-08T11:17:43.010 回答