Monitor.Wait 初始锁定?

Monitor.Wait Initially Locked?

背景

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

  1. 我对 SomeBlockingMethod 进行了方法调用。
  2. 此方法调用块,直到我从另一个线程调用 SomeUnblockingMethod
  3. 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() 通知等待进程。

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

我不知道是什么问题,但你想要的已经是它的工作原理了:

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?