我们可以使用Wait
andPulse
来模拟 aManualResetEvent
如下:
代码 #1
readonly object _locker = new object();
bool _signal;
void WaitOne()
{
lock (_locker)
{
while (!_signal) Monitor.Wait (_locker);
}
}
void Set()
{
lock (_locker)
{ _signal = true;
Monitor.PulseAll (_locker);
}
}
void Reset()
{
lock (_locker) _signal = false;
}
美好的
现在让我们谈谈将其增强为AutoREsetEvent
:
只需用AutoResetEvent
以下代码替换代码WaitOne
:
代码 #2
lock (_locker)
{
while (!_signal) Monitor.Wait (_locker);
_signal = false;//<---------------
}
并在方法中替换PulseAll
为:Pulse
Set
代码#3
lock (_locker)
{ _signal = true;
Monitor.Pulse (_locker);
}
问题是:在代码 #2 处,行_signal = false;
。
为什么有必要?Pulse
只会达到1 个等待句柄,我知道AutoREsetEvent
这只会让一个被阻止的物品通过并自动关闭大门。
那么为什么_signal = false
需要写作呢?.