我不明白這個例子如何工作http://msdn.microsoft.com/en-us/library/yy12yx1f(v=vs.80).aspx生產者/消費者msdn示例如何工作?
據我瞭解消費者不讀取由生產者生產的所有元素。 可能我不明白AutoResetEvent
是如何工作的。 Set
AutoreResetEvent
幾次有意義嗎?
_newItemEvent = new AutoResetEvent(false);
_newItemEvent.Set();
_newItemEvent.Set();
_newItemEvent.Set();
_newItemEvent.Set();
這就是我所理解的例子:
監製:
lock (((ICollection)_queue).SyncRoot)
{
while (_queue.Count < 20)
{
_queue.Enqueue(r.Next(0,100));
_syncEvents.NewItemEvent.Set();
count++;
}
}
消費者:
while (WaitHandle.WaitAny(_syncEvents.EventArray) != 1)
{
lock (((ICollection)_queue).SyncRoot)
{
int item = _queue.Dequeue();
}
count++;
}
監製鎖
_queue
:lock (((ICollection)_queue).SyncRoot)
生產者增加1元到
_queue
,並設置NewItemEvent
:_queue.Enqueue(r.Next(0,100)); _syncEvents.NewItemEvent.Set();
消費者走了進去「而」循環,因爲它是
NewItemEvent
設置收到通知,NetItemEvent
是取消設置,因爲它的AutoResetEvent:while (WaitHandle.WaitAny(_syncEvents.EventArray) != 1)
消費者「凍結」在下一行等待
_queue
鎖ŧ ø被釋放:lock (((ICollection)_queue).SyncRoot)
生產者繼續添加19個以上的元素到
_quere
和釋放_queue
對象消費者獲得
_queue
對象和Dequeue
一種元素的鎖:lock (((ICollection)_queue).SyncRoot) { int item = _queue.Dequeue(); }
消費者執行「while」循環的第二次迭代,因爲
NewItemEvent
已設置,因此現在未設置NetItemEvent
,因爲它是AutoRes etEvent:2次迭代後消費者等待NewItemEvent設置。
結果:生產者生產20個要素。 消費者:Dequeue
只有2個元素。
我期望消費者可以通過Dequeue
全部20個元素。
根據消費者的一個例子20個要素,問題是如何,爲什麼以及在我對程序的理解上出現了什麼問題。
謝謝,如何修改示例,如果我想1)隊列是無限的; 2)消費者應該儘快將元素出隊? – javapowered 2011-04-30 14:37:51