23

是否有与 Java 的CountDownLatch等效的 C# ?

4

2 回答 2

25

.NET Framework 版本 4 包括新的System.Threading.CountdownEvent类。

于 2009-12-07T01:24:25.690 回答
17

这是一个简单的实现(来自9 Reusable Parallel Data Structures and Algorithms):

要构建倒计时锁存器,您只需将其计数器初始化为 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();
    }
}
于 2009-12-07T01:21:08.787 回答