Monitor.Wait 初始锁定?
Monitor.Wait Initially Locked?
背景
我正在尝试编写一个执行以下操作的应用程序:
- 我对
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。如果你想有一个信号机制,那么 AutoResetEvent
或 ManualResetEvent
听起来是一个更好的选择。
我不知道是什么问题,但你想要的已经是它的工作原理了:
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
?
背景
我正在尝试编写一个执行以下操作的应用程序:
- 我对
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。如果你想有一个信号机制,那么 AutoResetEvent
或 ManualResetEvent
听起来是一个更好的选择。
我不知道是什么问题,但你想要的已经是它的工作原理了:
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
?