gpt4 book ai didi

c# - Monitor.Wait 是否需要同步?

转载 作者:太空狗 更新时间:2023-10-29 20:18:32 24 4
gpt4 key购买 nike

我开发了一个通用的生产者-消费者队列,它按以下方式由 Monitor 发出脉冲:

排队:

    public void EnqueueTask(T task)
{
_workerQueue.Enqueue(task);
Monitor.Pulse(_locker);
}

出队:

private T Dequeue()
{
T dequeueItem;
if (_workerQueue.Count > 0)
{
_workerQueue.TryDequeue(out dequeueItem);
if(dequeueItem!=null)
return dequeueItem;
}
while (_workerQueue.Count == 0)
{
Monitor.Wait(_locker);
}
_workerQueue.TryDequeue(out dequeueItem);
return dequeueItem;
}

等待部分产生以下 SynchronizationLockException :“从未同步的代码块调用了对象同步方法”我需要同步吗?为什么 ?使用 ManualResetEvents 还是 .NET 4.0 的 Slim 版本更好?

最佳答案

是的,如文档所述,当前线程需要“拥有”监视器才能调用 WaitPulse。 (因此您还需要为 Pulse 锁定。)我不知道为什么需要它的详细信息,但它在 Java 中是相同的。不过,我通常发现无论如何我都想这样做,以使调用代码干净。

注意 Wait 释放监视器本身,然后等待 Pulse,然后在返回之前重新获取监视器。

至于使用 ManualResetEventAutoResetEvent 代替 - 你可以,但我个人更喜欢使用 Monitor 方法,除非我需要其他一些方法等待句柄的特性(例如原子地等待任何/所有多个句柄)。

关于c# - Monitor.Wait 是否需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3797892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com