我已經開發出脈衝信號,通過監視器以下列方式通用的生產者 - 消費者隊列: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