Есть ли C # эквивалент Java CountDownLatch? - PullRequest
21 голосов
/ 07 декабря 2009

Есть ли C #, эквивалентный Java CountDownLatch ?

Ответы [ 2 ]

22 голосов
/ 07 декабря 2009

.NET Framework версии 4 включает новый класс System.Threading.CountdownEvent .

17 голосов
/ 07 декабря 2009

Вот простая реализация (из 9 многократно используемых параллельных структур данных и алгоритмов ):

Чтобы построить защелку обратного отсчета, вы просто инициализировать его счетчик на п, и иметь каждая подчиненная задача атомарно уменьшите его на единицу, когда он закончится, например, окружая операция декремента с блокировкой или с вызовом в Interlocked. Decrement. Затем вместо операции взятия поток может уменьшить и ждать счетчик станет нулем; когда проснулся, он будет знать, что п сигналов были зарегистрированы с защелкой. Вместо того, чтобы крутиться на этом условии, как в то время как (считать! = 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();
    }
}
...