背景

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

  • 我对 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() 向等待进程发出信号。

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

    关于c# - Monitor.Wait 最初锁定?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36648270/

    10-13 04:25