可以使用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,因为可以有任何数量的异步调用发生,这些调用在库的主状态中"注册"了自己?
希望这是有意义的
是的,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
方案的阻塞侧编码正确,那么它通常将不影响脉冲是如何产生的。没有更好地了解您的特定情况,我无法确定哪种脉冲策略是最佳的,但我认为我至少可以说无条件脉冲不会导致任何意想不到的副作用(再次,假设等待端编码正确)。