代码之家  ›  专栏  ›  技术社区  ›  Jim Mischel

BlockingCollection是否保证删除顺序?

  •  23
  • Jim Mischel  · 技术社区  · 14 年前

    我在几年前编写的应用程序中有一个有界阻塞队列。我们可以说,实现还不太理想,但它是有效的。但是,它有一些性能问题。它看起来像.NET4.0 BlockingCollection<T> 是正确的替换,但我需要确保它实际上是一个队列。也就是说,如果在单一生产商、单一消费者的时尚中使用,是否保证严格的先进先出?

    文件上没有明确说明。这个 BlockingCollection 题目确实说(在备注中):

    阻止收集<T> 传统阻塞队列数据 结构,除了 作为一个 IProducerConsumerCollection<T> .

    但并没有明确规定,这些东西会按照添加的顺序被移除。

    有人肯定知道吗?

    2 回复  |  直到 14 年前
        1
  •  43
  •   Reed Copsey    14 年前

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

    话虽如此, IProducerConsumerCollection<T> (在构造函数中指定)。如果没有在构造函数中提供,则在内部,它将使用 ConcurrentQueue<T>

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

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

        2
  •  1
  •   pjm    9 年前

    也许MSDN文档已经更新,因为这个问题,但它现在明确指出,BlockingCollection将默认为FIFO,除非另有指示。

    https://msdn.microsoft.com/en-us/library/dd997371(v=vs.110).aspx 如果微软改变了谷歌“MSDN BlockingCollection Overview”的链接