我在几年前编写的应用程序中有一个有界的阻塞队列.我们只是说实现不是很好,但它是有效的.但是,它存在一些性能问题.看起来.NET 4.0 BlockingCollection<T>
是正确的替代品,但我需要确保它实际上是一个队列.也就是说,如果以单一生产者,单一消费者的方式使用,它是否可以保证是严格的FIFO?
文档没有具体说明.该BlockingCollection话题不说(在备注):
BlockingCollection<T>
类似于传统的阻塞队列数据结构,除了底层数据存储机制被抽象为一个IProducerConsumerCollection<T>
.
但没有任何具体说明将按照添加的顺序删除内容.
有人知道吗?
Ree*_*sey 41
那么,BlockingCollection<T>
真的是专为并行工作,在那里你有多个simulataneous"生产者"和一个消费者(使用GetConsumingEnumerable()).
在这种情况下,您无法保证插入顺序,因此未指定排序约束.
这就是说,BlockingCollection<T>
适用于任何IProducerConsumerCollection<T>
(在构造函数中指定).如果你没有在构造函数中提供一个,在内部,它将使用a ConcurrentQueue<T>
.这导致它成为FIFO,因为它实际上是(内部)队列.所以,是的,在默认情况下,这将是"保证严格FIFO如果在单生产者,单消费者的方式使用",在当前实现至少.如果您想强制将其用于将来的校对(因为队列是实现细节),只需将其构造为:
var blockingCollection = new BlockingCollection<MyClass>(new ConcurrentQueue<MyClass>());
Run Code Online (Sandbox Code Playgroud)
这将保证它现在和将来使用队列(因为队列是一个实现细节).
归档时间: |
|
查看次数: |
7174 次 |
最近记录: |