C# 线程安全缓冲可观察优先级队列?

C# 线程安全缓冲可观察优先级队列?,c#,collections,container-classes,C#,Collections,Container Classes,我正在编写一个程序,其中一个线程需要将项目推送到队列中,一个或多个线程从队列中弹出项目并对其进行处理。为了避免内存不足,我希望生产者线程在队列满时休眠。有些项目的优先级高于其他项目,因此我希望先处理这些项目。如果这些项目具有相同的优先级,我希望首先处理添加的项目 我想在WPF数据网格中显示大约前100个项目,因此它也需要由UI线程访问。如果它能通知UI线程也有更新,也就是说,实现了IObservable,那就太好了 是否有一个容器类可以完成这一切 为了获得额外的积分,我非常确定在登船和离船时不需

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

我想在WPF数据网格中显示大约前100个项目,因此它也需要由UI线程访问。如果它能通知UI线程也有更新,也就是说,实现了IObservable,那就太好了

是否有一个容器类可以完成这一切

为了获得额外的积分,我非常确定在登船和离船时不需要锁定整个队列


4实现很好。

如果你在.NET 4上,你应该认真考虑使用这个例子的自定义调度器。我不确定它是否满足您的所有要求,但这将是一个良好的开端。

您在寻找一个容器时运气不佳-您必须自己实现一个容器。小心轻重缓急-排序变得很慢很快。我要做的是我自己实现了一个队列类,它在内部使用多个数组(每个优先级编码的低、中、高各一个)。这样我就永远不会分类。如果可以避免锁(假设为多核)并使用旋转锁(.NET 4.0),它们在队列场景中更快/开销更小。

我过去所做的是将多个集合包装到一个集合中——类似的。当您想要的优先级较低时,这是非常合理的。例如,在某些情况下,它甚至可以有两个:高和低。然后,您的
TryDequeue
方法如下所示:

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

这并不是对你问题的全面回答,但也许可以帮助你开始。

我不会每次插入都使用整个系列。。。那太疯狂了。我会像你建议的那样使用多个数组(或队列),或者某种树结构。树结构比多个队列慢(但如果可能的优先级较高,则效率更高,这几乎没有意义)。树的重新平衡是非常明智的,而且你永远不需要在队列中搜索它们。。。但它没有提到任何优先事项。它确实说它可以封装实现IProducerConsumerCollection的任何东西。。。是否有一个是优先级队列?请参见此示例,FWIW任务可以转换为Rx可观测任务。;)不过,我不喜欢限制可能的优先事项的数量。我想使用一个计算值作为优先级,但我事先不知道范围。@马克:有时人们会在内部使用
SortedList
之类的东西来实现这一点;但正如TomTom已经提到的,无限优先权的成本最终可能不值得。折衷方案是什么:有一个计算值,根据它在某个范围内的位置转换为预定义的优先级?是的。。。我在想也许这就是我应该做的。我讨厌对事情进行任意的限制,但如果我不这样做,我想我为自己创造了太多的工作。我在使用
SortedDictionary
实现它的过程中,意识到在排队和退票时,我都必须锁定结构,以便管理密钥,这带走了一些同时带来的好处:(我的回答可能有点离题,但我强烈不同意它不能解决问题。专用线程上的数据处理实际上是通过对集合中的数据进行排序来安排的。任务是一种更高级别的抽象,可以封装数据及其处理,而无需直接处理threads-这有很多好处。在这种情况下,调度可以通过任务调度器来实现。