我正在编写一个程序,其中一个线程需要将项目推送到队列中,并且一个或多个线程将项目从队列中弹出并处理它们。为了避免内存不足,我希望生产者线程在队列变满时休眠。有些项目的优先级高于其他项目,所以我希望首先处理这些项目。如果项目具有相同的优先级,我希望首先添加的项目首先被处理。
我想在WPF DataGrid中显示前100个项目,因此它也需要由UI线程访问。如果它可以通知UI线程也有更新,那就更好了,即实现IObservable。
是否有容器类可以完成所有这些?
对于奖励积分,我很确定在排队和出队时都不需要锁定整个队列。
.NET 4实现很好。
答案 0 :(得分:3)
你很难找到一个容器 - 你必须自己实施一个容器。小心优先级 - 排序速度很慢。我所做的是我自己实现了一个队列类,内部使用多个数组(每个优先级一个 - 编码低,中,高)。这样我从不排序。如果可以,请避免使用锁(假设为多核)并使用自旋锁(.NET 4.0),它们在队列方案中更快/更少开销。
答案 1 :(得分:2)
如果您使用的是.NET 4,则应该认真考虑使用自定义调度程序Task Parallel Library,例如QueuedTaskScheduler。我不确定它是否满足您的所有要求,但这将是一个良好的开端。
答案 2 :(得分:2)
我过去所做的是将多个ConcurrentQueue<T>
个集合包装成一个 - TomTom suggests。当您打算拥有的优先级数量很少时,这是非常合理的。例如,在某些情况下,甚至可能有两个:高和低。然后你的TryDequeue
方法看起来像这样:
public bool TryDequeue(out T item)
{
return _highItems.TryDequeue(out item) || _lowItems.TryDequeue(out item);
}
这不是对您的问题的全面答案,但也许它可以帮助您开始。