考虑以下模式:
private AutoResetEvent signal = new AutoResetEvent(false);
private void Work()
{
while (true)
{
Thread.Sleep(5000);
signal.Set();
//has a waiting thread definitely been signaled by now?
signal.Reset();
}
}
public void WaitForNextEvent()
{
signal.WaitOne();
}
此模式的目的是允许外部消费者等待某个事件(例如 - 消息到达)。WaitForNextEvent
不是从类中调用的。
举一个应该熟悉的例子,考虑System.Diagnostics.Process
. 它公开了一个Exited
事件,但也公开了一个WaitForExit
方法,该方法允许调用者同步等待,直到进程退出。这就是我要在这里实现的目标。
我需要的原因signal.Reset()
是,如果一个线程调用WaitForNextEvent
after signal.Set()
已经被调用(或者换句话说,如果.Set
在没有线程等待时被调用),它会立即返回,因为该事件之前已经发出信号。
问题
- 是否保证在调用线程调用之前
WaitForNextEvent()
会发出信号?如果没有,实现方法的其他解决方案是什么?signal.Reset()
WaitFor