监视器.等待最初锁定

本文关键字:锁定 等待 监视器 | 更新日期: 2024-09-08 08:31:58

背景

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

  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()发出等待过程的信号。

当您想要保护资源或您有关键部分时,应该使用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。或者SomeUnblockingMethodSomeBlockingMethod之前被称为