可以使用Monitor吗?PulseAll无条件放人

本文关键字:无条件 PulseAll Monitor 可以使 | 更新日期: 2023-09-27 17:50:24

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

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);
}

只是想弄清楚当应用程序的内部状态发生变化时,我是否应该总是脉冲。在一个主要是异步调用的大型库中,我是否应该或多或少地总是使用PulseAll,因为可以有任何数量的异步调用发生,这些调用在库的主状态中"注册"了自己?

希望这是有意义的

可以使用Monitor吗?PulseAll无条件放人

是的,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方案的阻塞侧编码正确,那么它通常将不影响脉冲是如何产生的。没有更好地了解您的特定情况,我无法确定哪种脉冲策略是最佳的,但我认为我至少可以说无条件脉冲不会导致任何意想不到的副作用(再次,假设等待端编码正确)。