可以无条件地使用Monitor.PulseAll吗?

时间:2011-04-16 12:27:06

标签: c# locking monitor

例如,每次异步操作完成时都会影响应用程序的状态,我就这样做了

lock (_parent._stateObj) {

    _parent._asyncOperations.Remove(this);

    Monitor.PulseAll(_parent._stateObj);

}

我这样做是为了通知所有等待操作完成的事情,例如注销例程。

我/我是否应该按照

的方式做更多事情
lock (_parent._stateObj) {

    _parent._asyncOperations.Remove(this);

    if (_parent._loggingOut) Monitor.PulseAll(_parent._stateObj);

}

当应用程序的内部状态发生变化时,试着弄清楚我是否应该始终是Pulsing。在一个主要是异步调用的大型库中,我是否应该或多或少总是使用PulseAll,因为可以发生任何数量的异步调用,这些异步调用已经在库的主状态中“注册”了?

希望这是有道理的

1 个答案:

答案 0 :(得分:1)

是的,PulseAll无条件地接受,有时甚至是强制性的。要记住的最重要的事情是在调用Wait时始终重新检查等待条件。

public void WaitingThread()
{
  lock (mylock)
  {
    while (!CanProceed())
    {
      Monitor.Wait(mylock);
    }
    // The wait condition is finally satisfied so we can proceed now.
  }
}

因此,如果您正确编码PulseAll\Wait方案的阻塞端,那么通常与脉冲的生成方式无关。如果不能更好地了解您的特定情况,我无法确定哪种脉冲策略是最佳的,但我认为我至少可以说无条件脉冲不会导致任何意外的副作用(同样,假设等待侧编码正确)。