BlockingCollection <t>是否保证删除顺序?</t>

时间:2010-09-29 19:46:26

标签: c# .net

我在几年前编写的应用程序中有一个有界的阻塞队列。我们只是说实现不是很好,但它是有效的。但是,它存在一些性能问题。看起来.NET 4.0 BlockingCollection<T>是正确的替代品,但我需要确保它实际上是一个队列。也就是说,如果以单一生产者,单一消费者的方式使用,它是否保证是严格的FIFO?

文档没有具体说明。 BlockingCollection主题确实说(在备注中):

  

BlockingCollection<T>类似于a   传统的阻塞队列数据   结构,除了底层   数据存储机制是抽象的   离开IProducerConsumerCollection<T>

但没有具体说明事情会按照他们添加的顺序删除。

有人知道吗?

2 个答案:

答案 0 :(得分:39)

嗯,BlockingCollection<T>实际上是为并行工作而设计的,你有多个同时的“生产者”和一个消费者(使用GetConsumingEnumerable())。

在这种情况下,您无法保证插入顺序,因此未指定排序约束。

话虽如此,BlockingCollection<T>适用于任何IProducerConsumerCollection<T>(在构造函数中指定)。如果您没有在内部构造函数中提供一个,它将使用ConcurrentQueue<T>。这导致它成为FIFO,因为它实际上是(内部)队列。所以是的,默认情况下,至少在当前的实现中,“如果以单一生产者,单一消费者的方式使用”,它将“保证是严格的FIFO”。如果您想强制将其用于将来的校对(因为队列是实现细节),只需将其构造为:

var blockingCollection = new BlockingCollection<MyClass>(new ConcurrentQueue<MyClass>());

这将保证它现在和将来使用队列(因为队列是一个实现细节)。

答案 1 :(得分:1)

自从这个问题以来,MSDN文档可能已经更新,但它现在明确指出除非另有指示,否则BlockingCollection将默认为FIFO。

请参阅: https://msdn.microsoft.com/en-us/library/dd997371(v=vs.110).aspx 或者如果MS更改链接谷歌'MSDN BlockingCollection概述'

NET Framework 4.6和4.5

在该页面上查找“指定集合类型”。