监视器.等待最初锁定
本文关键字:锁定 等待 监视器 | 更新日期: 2024-09-08 08:31:58
背景
我正在尝试编写一个应用程序,它可以执行以下操作:
- 我对
SomeBlockingMethod
进行了一个方法调用 - 此方法调用块,直到我从另一个线程调用
SomeUnblockingMethod
为止 - 当调用
SomeUnblockingMethod
时,SomeBlockingMethod
内部的例程将继续
注意,我要做的第一件事是调用SomeBlockingMethod
,然后再调用SomeUnblockingMethod
。我正在考虑使用Monitor.Wait/Monitor.Pulse
机制来实现这一点。唯一的问题是,当调用Monitor.Wait
时,除非所涉及的object
已经被其他东西锁定(或者至少我不知道),否则不能进行初始阻止。。。但是,我希望阻止成为我做的第一件的事情……所以这就引出了我的问题。。。
问题
有没有什么方法可以实现Monitor.Wait
,以便在调用Monitor.Pulse
之前进行初始阻塞?
您可以改用AutoResetEvent。
AutoResetEvent ar = new AutoResetEvent(false); // false set initial state as not signaled
然后可以使用ar.WaitOne()
进行等待,使用ar.Set()
发出等待过程的信号。
当您想要保护资源或您有关键部分时,应该使用Monitor。如果你想有一个信号机制,那么AutoResetEvent
或ManualResetEvent
听起来是一个更好的选择。
我不知道问题出在哪里,但你想要的已经是它的工作方式:
object _lock = new object();
void SomeBlockingMethod()
{
lock(_lock)
Monitor.Wait(_lock);
... // here only after pulse
}
void SomeUnblockingMethod()
{
lock(_lock)
Monitor.Pulse(_lock);
}
也许您正在从多个地方调用SomeBlockingMethod
,那么您希望使用PulseAll
。或者SomeUnblockingMethod
在SomeBlockingMethod
之前被称为?