Monitor.Wait最初被锁定?

时间:2016-04-15 13:16:57

标签: c# .net multithreading locking thread-synchronization

背景

我正在尝试编写执行以下操作的应用程序:

  1. 我打电话给SomeBlockingMethod
  2. 此方法调用块,直到我从另一个线程调用SomeUnblockingMethod
  3. 调用SomeUnblockingMethod时,SomeBlockingMethod内的例程将继续。
  4. 注意,我要做的第一件事就是致电SomeBlockingMethod,然后我会打电话给SomeUnblockingMethod。我正在考虑使用Monitor.Wait/Monitor.Pulse机制来实现这一目标。唯一的问题是,当一个人调用Monitor.Wait时,除非所涉及的object已经被其他东西锁定(或者至少不是我所知道的),否则你无法阻止初始......但是,我想要阻止成为我做的第一个事情......所以这引出了我的问题......

    问题

    在我调用Monitor.Wait之前,我是否可以通过某种方式实现Monitor.Pulse初始阻止?

2 个答案:

答案 0 :(得分:2)

您可以改为使用AutoResetEvent

AutoResetEvent ar = new AutoResetEvent(false); // false set initial state as not signaled

然后您可以使用ar.WaitOne()等待,ar.Set()表示等待进程。

如果要保护资源或使用critical section,则应使用Monitor。如果你想拥有一个信令机制,那么AutoResetEventManualResetEvent听起来就像是一个更好的选择。

答案 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。或者SomeUnblockingMethodSomeBlockingMethod之前被称为