Есть ли эквивалент С# для Java CountDownLatch?
Есть ли эквивалент С# для Java CountDownLatch?
Ответ 1
Версия .NET Framework версии 4 включает новый класс System.Threading.CountdownEvent.
Ответ 2
Вот простая реализация (из 9 многоразовых параллельных структур данных и алгоритмов):
Чтобы создать обратный отсчет, вы просто инициализируйте свой счетчик n и каждая подчиненная задача атомарно уменьшать его на единицу, когда он заканчивается, например, окружая операция уменьшения с блокировкой или с вызовом Interlocked.Decrement. Затем вместо операции поток может уменьшаться и ждать счетчик равен нулю; когда проснулся, он будет знать, что 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(); } }