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:inProgress,2:已完成,3:completeWithErrors)。

我想知道在继续执行脚本之前检查列表中的每个作业是否已完成的最佳方法是什么。

注意:我之前尝试过使用 ThreadPool 和 WaitAll,但它确实允许我像信号量那样拥有有限数量的线程(没有辅助效果),而且我还遇到了 ManualResetEvent 数组大小的限制,因为它是Windows 窗体。

4

1 回答 1

1

您通常可以Thread.Join在单独的foreach循环中调用每个线程。

顺便说一句,您可以将信号量与线程池结合起来:让每个工作项在执行任何工作之前在信号量上等待。

于 2010-03-09T12:37:32.850 回答