让线程等待n个脉冲
本文关键字:脉冲 等待 线程 | 更新日期: 2023-09-27 18:26:55
如何等待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中引入的),则我的解决方案是好的