Is there a C# equivalent to Java's CountDownLatch?

10,549

Solution 1

The .NET Framework version 4 includes the new System.Threading.CountdownEvent class.

Solution 2

Here is a simple implementation (from 9 Reusable Parallel Data Structures and Algorithms):

To build a countdown latch, you just initialize its counter to n, and have each subservient task atomically decrement it by one when it finishes, for example by surrounding the decrement operation with a lock or with a call to Interlocked.Decrement. Then, instead of a take operation, a thread could decrement and wait for the counter to become zero; when awoken, it will know that n signals have been registered with the latch. Instead of spinning on this condition, as in while (count != 0), it’s usually a good idea to let the waiting thread block, in which case you then have to use an event.

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();
    }
}
Share:
10,549

Related videos on Youtube

Kiril
Author by

Kiril

CEO and Co-Founder of ST6.io E-mail: click to reveal e-mail

Updated on December 07, 2020

Comments

  • Kiril
    Kiril over 3 years

    Is there a C# equivalent to Java's CountDownLatch?

  • Kiril
    Kiril over 14 years
    I'm going to compare both answers and I might have to award it to you (CesarGon)... it seems that yours is better, because you offer a solution that is built into C# already.
  • CesarGon
    CesarGon over 14 years
    That's fair enough, Lirik. :-)