2 ответа
Версия.NET Framework 4 включает новый класс System.Threading.CountdownEvent.
Вот простая реализация (из 9 повторно используемых параллельных структур данных и алгоритмов):
Чтобы построить защелку обратного отсчета, вы просто инициализируете ее счетчик n, и каждая подчиненная задача атомарно уменьшает ее на единицу по завершении, например, окружая операцию декремента блокировкой или вызовом Interlocked.Decrement. Затем вместо операции take поток может уменьшить значение и ожидать, пока счетчик не станет равным нулю; когда он проснется, он будет знать, что в защелке было зарегистрировано n сигналов. Вместо того, чтобы вращаться в этом состоянии, как в while (count!= 0), обычно хорошей идеей будет позволить ожидающему потоку блокироваться, и в этом случае вам придется использовать событие.
public class CountdownLatch { private int m_remain; private EventWaitHandle m_event; public CountdownLatch(int count) { m_remain = count; m_event = new ManualResetEvent(false); } public void Signal() { // The last thread to signal also sets the event. if (Interlocked.Decrement(ref m_remain) == 0) m_event.Set(); } public void Wait() { m_event.WaitOne(); } }