我如何等待 n 脉冲数?
… // do something
waiter.WaitForNotifications();
我希望上面的线程等到 n 次通知(由 n 不同的线程或 n 次由同一个线程通知)。
我相信有一种计数器可以做到这一点,但我找不到它。
答案 0 :(得分:22)
CountdownEvent类
表示在计数达到零时发出信号的同步原语。
示例:的
CountdownEvent waiter = new CountdownEvent(n);
// notifying thread
waiter.Signal();
// waiting thread
waiter.Wait();
答案 1 :(得分:8)
使用简单的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();
}
}
请注意,最后,您的问题通常与其他问题有关:Workaround for the WaitHandle.WaitAll 64 handle limit?
如果您没有.NET> = 4(因为另一个解决方案CountdownEvent
是在.NET 4中引入的话),我的解决方案很好。