【问题标题】:check that every thread of semaphore has completed检查信号量的每个线程是否已完成
【发布时间】:2010-03-09 12:20:32
【问题描述】:

我有一个通过 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 窗体。

【问题讨论】:

    标签: c# multithreading semaphore


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 2017-05-20
      • 2014-07-22
      • 1970-01-01
      • 2017-12-10
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多