проверьте, что каждая нить семафора завершена - PullRequest
3 голосов
/ 09 марта 2010

У меня есть семафор, который запускается через список объектов 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: завершенWithErrors).

Мне было интересно, как лучше всего проверить, что каждая работа в списке выполнена, прежде чем продолжить работу со сценарием.

Примечание: Я пробовал раньше с ThreadPool и WaitAll, но это позволяет мне иметь ограниченное количество потоков (без дополнительных эффектов), как семафор, и я также столкнулся с ограничением размер массива ManualResetEvent, потому что это форма Windows.

1 Ответ

1 голос
/ 09 марта 2010

Обычно вы можете вызывать Thread.Join в каждом потоке в отдельном цикле foreach.

Кстати, вы можете комбинировать семафор с пулом потоков: каждый рабочий элемент должен ждать на семафоре, прежде чем выполнять какую-либо работу.

...