【发布时间】:2011-04-30 12:21:16
【问题描述】:
我不明白这个例子是如何工作的http://msdn.microsoft.com/en-us/library/yy12yx1f(v=vs.80).aspx
据我了解,Consumer 不会读取 Producer 生成的所有元素。
可能我没有正确理解AutoResetEvent 的工作原理。多次SetAutoreResetEvent有意义吗?
_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) -
Producer 将 1 个元素添加到
_queue并设置NewItemEvent:_queue.Enqueue(r.Next(0,100)); _syncEvents.NewItemEvent.Set(); -
消费者进入“while”循环,因为它收到通知,
NewItemEvent已设置,NetItemEvent现在未设置,因为它是 AutoResetEvent:while (WaitHandle.WaitAny(_syncEvents.EventArray) != 1) -
消费者“冻结”在下一行等待
_queue锁被释放:lock (((ICollection)_queue).SyncRoot) Producer 继续向
_quere添加 19 个元素并释放_queue对象-
消费者获得
_queue对象和Dequeue一个元素的锁:lock (((ICollection)_queue).SyncRoot) { int item = _queue.Dequeue(); } 消费者执行“while”循环的第二次迭代,因为
NewItemEvent已设置,NetItemEvent现在未设置,因为它是 AutoResetEvent:2 次迭代后,消费者等待设置 NewItemEvent。
结果:Producer 制作了 20 个元素。
消费者:Dequeue 只有 2 个元素。
我希望消费者 Dequeue 所有 20 个元素。
根据一个示例 Consumer 是 Dequeue 20 个元素,问题是我对程序的理解是如何、为什么以及什么错误。
【问题讨论】:
标签: c# multithreading