让一个线程等待n个脉冲

时间:2013-08-09 09:51:37

标签: c# multithreading

我如何等待 n 脉冲数?

… // do something
waiter.WaitForNotifications();

我希望上面的线程等到 n 次通知(由 n 不同的线程或 n 次由同一个线程通知)。

我相信有一种计数器可以做到这一点,但我找不到它。

2 个答案:

答案 0 :(得分:22)

查看CountdownEvent Class

  

CountdownEvent类

     

表示在计数达到零时发出信号的同步原语。

示例:

CountdownEvent waiter = new CountdownEvent(n);

// notifying thread
waiter.Signal();

// waiting thread
waiter.Wait();

答案 1 :(得分:8)

使用简单的ManualResetEventInterlocked.Decrement

class SimpleCountdown
{
    private readonly ManualResetEvent mre = new ManualResetEvent(false);

    private int remainingPulses;

    public int RemainingPulses
    {
        get
        {
            // Note that this value could be not "correct"
            // You would need to do a 
            // Thread.VolatileRead(ref this.remainingPulses);
            return this.remainingPulses;
        }
    }

    public SimpleCountdown(int pulses)
    {
        this.remainingPulses = pulses;
    }

    public void Wait()
    {
        this.mre.WaitOne();
    }

    public bool Pulse()
    {
        if (Interlocked.Decrement(ref this.remainingPulses) == 0)
        {
            mre.Set();
            return true;
        }

        return false;
    }
}

public static SimpleCountdown sc = new SimpleCountdown(10);

public static void Waiter()
{
    sc.Wait();
    Console.WriteLine("Finished waiting");
}

public static void Main()
{
    new Thread(Waiter).Start();

    while (true)
    {
        // Press 10 keys
        Console.ReadKey();

        sc.Pulse();
    }
}

请注意,最后,您的问题通常与其他问题有关:Workaround for the WaitHandle.WaitAll 64 handle limit?

如果您没有.NET> = 4(因为另一个解决方案CountdownEvent是在.NET 4中引入的话),我的解决方案很好。