如何等待n个脉冲?
… // do something
waiter.WaitForNotifications();
我希望上面的线程等到被通知n次(由n 个不同的线程或n次由同一线程通知)。
我相信有一种计数器可以做到这一点,但我找不到。
如何等待n个脉冲?
… // do something
waiter.WaitForNotifications();
我希望上面的线程等到被通知n次(由n 个不同的线程或n次由同一线程通知)。
我相信有一种计数器可以做到这一点,但我找不到。
CountdownEvent 类
表示当其计数达到零时发出信号的同步原语。
例子:
CountdownEvent waiter = new CountdownEvent(n);
// notifying thread
waiter.Signal();
// waiting thread
waiter.Wait();
通过使用一个简单ManualResetEvent
且Interlocked.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 中引入了另一个解决方案 )