2

そこで、ループを使用して複数のBackgroundWorkersを作成します。

  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 に答える