首页 > 解决方案 > C#:是否可以在不消耗/销毁元素的情况下枚举 BlockingCollection(不是请求枚举器时的快照)?

问题描述

我需要使用一种消费者生产者模式(基于队列),其中消费者线程实际上并不消耗(销毁)元素*,而是消费者线程可以在任何时候请求一个句柄到开头排队并开始以自己的速度枚举它。我不能使用ConcurrentQueue,因为枚举ConcurrentQueue适用于它的快照(Enumerator在请求时拍摄),所以消费者线程不会看到生产者同时添加的元素。

在我看来,它BlockingCollection应该是正确使用的类,但它显然只提供了两种类型的 Enumerators/Enumerables:

GetConsumingEnumerable(), 哪个

BlockingCollection.IEnumerable, 哪个

仅提供这两种组合的事实BlockingCollection似乎太受限制而无法在我的场景中使用 - 我需要在真实队列上工作的东西(就像ConsumingEnumerable那样),但只枚举元素而不破坏(就像BlockingCollection.IEnumerable那样)。

问题:

任何人都可以建议是否有一种方法可以在不编写自己的队列实现的情况下实现这一点(显然,当我们谈论多线程环境时,我认为这是一件相当令人沮丧的事情) - 这可以通过使用来实现BlockingCollection,还是存在其他一些可以支持这种行为的集合?

[(*) 事实上,一个指定的消费者线程实际上有时可能会破坏元素(即调用Dequeue)。但是,如果需要说此操作必须使所有其他消费者正在进行的枚举无效,我很好,因此可以将问题简化为假设消费者根本没有Dequeue。]

标签: c#.netmultithreading

解决方案


推荐阅读