背景
我正在尝试编写执行以下操作的应用程序:
SomeBlockingMethod
。SomeUnblockingMethod
。SomeUnblockingMethod
时,SomeBlockingMethod
内的例程将继续。注意,我要做的第一件事就是致电SomeBlockingMethod
,然后我会打电话给SomeUnblockingMethod
。我正在考虑使用Monitor.Wait/Monitor.Pulse
机制来实现这一目标。唯一的问题是,当一个人调用Monitor.Wait
时,除非所涉及的object
已经被其他东西锁定(或者至少不是我所知道的),否则你无法阻止初始......但是,我想要阻止成为我做的第一个事情......所以这引出了我的问题......
问题
在我调用Monitor.Wait
之前,我是否可以通过某种方式实现Monitor.Pulse
初始阻止?
答案 0 :(得分:2)
您可以改为使用AutoResetEvent。
AutoResetEvent ar = new AutoResetEvent(false); // false set initial state as not signaled
然后您可以使用ar.WaitOne()
等待,ar.Set()
表示等待进程。
如果要保护资源或使用critical section,则应使用Monitor。如果你想拥有一个信令机制,那么AutoResetEvent
或ManualResetEvent
听起来就像是一个更好的选择。
答案 1 :(得分:1)
我不知道问题是什么,但你想要的是它的工作方式:
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
之前被称为?