【发布时间】:2016-05-29 10:11:30
【问题描述】:
我在 C# 中为使用 AutoResetEvent 的消费者和生产者提供了以下代码,但在有多个生产者和一个消费者的情况下它们不起作用。问题是消费者不能消费队列中的所有项目。当我调试时,我注意到消费者只能删除一项,然后它返回 false 并且不能再删除。似乎问题出在 AutoResetEvent 中,但我不知道出了什么问题。
private AutoResetEvent newItemSignal = new AutoResetEvent(false);
private Queue<Task> iQueue = new Queue<Task>();
public void Enqueue(Task task)
{
lock (((ICollection)iQueue).SyncRoot)
{
iQueue.Enqueue(task);
newItemSignal.Set();
}
}
public bool Dequeue(out Task task, int timeout)
{
if (newItemSignal.WaitOne(timeout, false))
{
lock (((ICollection)iQueue).SyncRoot)
{
task = iQueue.Dequeue();
}
return true;
}
task = default(Task);
return false;
}
【问题讨论】:
-
如果您使用的是 .NET 4.0 或更高版本,您可能需要使用 BlockingCollection
标签: c# queue producer-consumer autoresetevent