0

我们可以使用WaitandPulse来模拟 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为:PulseSet

代码#3

lock (_locker) 
   { _signal = true; 
     Monitor.Pulse (_locker); 
   }

问题是:在代码 #2 处,行_signal = false;

为什么有必要?Pulse只会达到1 个等待句柄,我知道AutoREsetEvent这只会让一个被阻止的物品通过并自动关闭大门。

那么为什么_signal = false需要写作呢?.

4

1 回答 1

3

如果_signal变量保持不变true,那么如果另一个线程在调用之后WaitOne 调用Set,它就不会等待。您不仅要考虑如何处理现有的等待线程- 您还必须考虑对象的整体状态。

于 2012-07-06T11:59:49.713 回答