我已经开发出脉冲信号,通过监视器以下列方式通用的生产者 - 消费者队列:Monitor.Wait是否需要同步?
入队:
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版本更好?
你为什么要这样做?你将如何合并显示器?只是用于显示器的锁定器对象的锁定?不知道锁是否添加了ResetEvents不需要的另一个上下文切换? – user437631 2010-09-26 13:14:00
@ user437631:是的,只是一个普通的'lock'语句没问题。这可能需要或可能不需要额外的上下文切换 - 我不认为您有任何证据表明ResetEvents不需要它。实际上,由于它们是CLR内部对象,而不是可能交叉处理Win32对象,所以监视器比ResetEvents更轻。 – 2010-09-26 15:46:24