gpt4 book ai didi

c# - BlockingCollection 是否保证移除顺序?

转载 作者:IT王子 更新时间:2023-10-29 04:26:52 26 4
gpt4 key购买 nike

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

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

BlockingCollection<T> is similar to a traditional blocking queue data structure, except that the underlying data storage mechanism is abstracted away as an IProducerConsumerCollection<T>.

但没有明确说明内容将按照添加的顺序删除。

有人知道吗?

最佳答案

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

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

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

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

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

关于c# - BlockingCollection<T> 是否保证移除顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3825275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com