入列:
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版本更好吗?
lock
语句就可以了。这可能需要额外的上下文切换,也可能不需要 - 我认为你没有证据表明ResetEvents不需要它。事实上,由于它们是CLR内部对象而不是潜在的跨进程Win32对象,监视器比ResetEvents更轻量级。 - Jon Skeet