让线程等待n个脉冲

本文关键字:脉冲 等待 线程 | 更新日期: 2023-09-27 18:26:55

如何等待n脉冲数?

… // do something
waiter.WaitForNotifications();

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

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

让线程等待n个脉冲

查看CountdownEvent类:

倒计时事件类

表示一个同步基元,该基元在计数达到零时发出信号。

示例:

CountdownEvent waiter = new CountdownEvent(n);
// notifying thread
waiter.Signal();
// waiting thread
waiter.Wait();

通过使用简单的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();
    }
}

请注意,最后,这个问题通常与另一个问题有关:WaitHandle.WaitAll 64句柄限制的解决方法?

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