3

Job オブジェクトのリストを介して実行されるセマフォがあります。

コードのサンプルを次に示します。

List<Job> jobList = jobQueue.GetJobsWithStatus(status);
if (jobList.Count > 0)
{
  foreach (Job job in jobList)
  {
    semaphore.WaitOne();

    // Only N threads can get here at once
    job.semaphore = semaphore;
    ThreadStart threadStart = new ThreadStart(job.Process);

    Thread workerThread = new Thread(threadStart);
    workerThread.Start();
  }

  //check that every thread has completed before continuing
}

すべてのジョブ オブジェクトには、ステータス メンバー変数a (0: 新規、1: 進行中、2: 完了、3: 完了したエラーあり) があります。

スクリプトを続行する前に、リスト内のすべてのジョブが完了したことを確認する最善の方法は何かと考えていました。

注:前に ThreadPool と WaitAll を試してみましたが、セマフォのように (二次的な影響なしで) 限られた量のスレッドを持つことができず、ManualResetEvent 配列のサイズの制限にも達しました。 Windows フォーム。

4

1 に答える 1

1

通常、個別のループThread.Joinで各スレッドを呼び出すことができます。foreach

ところで、セマフォをスレッド プールと組み合わせることができます。つまり、作業を行う前に、各作業項目をセマフォで待機させます。

于 2010-03-09T12:37:32.850 に答える