例如,每次异步操作完成时都会影响应用程序的状态,我就这样做了
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,因为可以发生任何数量的异步调用,这些异步调用已经在库的主状态中“注册”了?
希望这是有道理的
答案 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
方案的阻塞端,那么通常与脉冲的生成方式无关。如果不能更好地了解您的特定情况,我无法确定哪种脉冲策略是最佳的,但我认为我至少可以说无条件脉冲不会导致任何意外的副作用(同样,假设等待侧编码正确)。