5

我正在编写一个程序,其中一个线程需要将项目推送到队列中,并且一个或多个线程将项目从队列中弹出并处理它们。为了避免内存不足,我希望生产者线程在队列满时休眠。有些项目的优先级高于其他项目,所以我希望先处理这些项目。如果项目具有相同的优先级,我希望最先添加的项目首先被处理。

我想在 WPF DataGrid 中显示前 100 个左右的项目,因此它也需要由 UI 线程访问。如果它可以通知 UI 线程也有更新,那就太好了,即实现 IObservable。

是否有一个容器类可以完成所有这些工作?

对于奖励积分,我很确定在入队和出队时都不需要锁定整个队列。

.NET 4 实现很好。

4

3 回答 3

3

您在寻找容器时运气不佳 - 您必须自己实现一个。请注意优先级 - 排序会很快变慢。我所做的是我自己实现了一个队列类,它在内部使用多个数组(每个优先级一个 - 编码为低、中、高)。这样我从不排序。如果可以(假设为多核),请避免使用锁并使用自旋锁(.NET 4.0),它们在队列场景中更快/携带更少的开销。

于 2010-09-25T05:30:34.600 回答
2

如果您使用的是 .NET 4,则应该认真考虑具有自定义调度程序的任务并行库,例如示例QueuedTaskScheduler。我不确定它是否满足您的所有要求,但这将是一个好的开始。

于 2010-09-25T05:17:28.767 回答
2

我过去所做的就是将多个ConcurrentQueue<T>系列包装成一个系列——就像TomTom 所建议的那样。当您打算拥有的优先级数量很少时,这是非常合理的。例如,在某些情况下,甚至可能有两个就足够了:高和低。然后你的TryDequeue方法看起来像这样:

public bool TryDequeue(out T item)
{
    return _highItems.TryDequeue(out item) || _lowItems.TryDequeue(out item);
}

这并不是对您问题的全面回答,但也许它可以帮助您入门。

于 2010-09-25T05:51:09.073 回答