Как определить, когда все мои потоки закончили свою работу? - PullRequest
3 голосов
/ 12 августа 2011

У меня есть архитектура, которая считывает пакеты из пакетного двоичного файла, назначает каждый пакет отдельному конвейеру обработки на основе типа пакета и повторно собирает пакеты в новый файл на другой стороне конвейеров. Каждый конвейер содержит очереди блокировки, подобные этому.

На каждой стороне очереди блокировки в каждом трубопроводе имеется поток, который выполняет цикл, который ставит в очередь или удаляет пакеты из очереди. Эти потоки запускаются асинхронно (т. Е. Стиль «запускай и забывай») из объекта контроллера. Этот объект контроллера имеет коллекцию Dictionary<int, ChannelPipeline>, которая содержит все объекты конвейера.

Вот мой вопрос: Какой механизм я могу установить, который сообщит мне, когда все конвейеры завершат обработку? В каждом конвейере есть свойство EndOfData; мне нужно постоянно опрашивать это свойство в каждом конвейере, пока все они не прочитают true, или есть лучший (то есть более эффективный) способ?

1 Ответ

2 голосов
/ 12 августа 2011

Если вы знаете общее количество конвейеров, которое вы можете рассмотреть AutoResetEvent + целое число

AutoResetEvent allThreadsDone = new AutoResetEvent(false);
int completedThreads;
int scheduledThreads;

в основном каждый рабочий поток будет увеличивать свое значение Interlocked.Increment() и устанавливать событие в случае, когда это последний поток:

Interlocked.Increment(ref completedThreads);
if (completedThreads == scheduledThreads)
{
    allThreadsDone.Set();
}

В теме мониторинга вы просто делаете:

 allThreadsDone.WaitOne();
   // here is we know that all threads are finished
...