c# - C#:是否可以在不消耗/销毁元素的情况下枚举 BlockingCollection(不是请求枚举器时的快照)?
问题描述
我需要使用一种消费者生产者模式(基于队列),其中消费者线程实际上并不消耗(销毁)元素*,而是消费者线程可以在任何时候请求一个句柄到开头排队并开始以自己的速度枚举它。我不能使用ConcurrentQueue
,因为枚举ConcurrentQueue
适用于它的快照(Enumerator
在请求时拍摄),所以消费者线程不会看到生产者同时添加的元素。
在我看来,它BlockingCollection
应该是正确使用的类,但它显然只提供了两种类型的 Enumerators/Enumerables:
GetConsumingEnumerable()
, 哪个
- 销毁元素(调用 Dequeue)
- 适用于该系列的真实版本
BlockingCollection.IEnumerable
, 哪个
- 不会破坏元素
- 处理请求 Enumerator 时拍摄的快照
仅提供这两种组合的事实BlockingCollection
似乎太受限制而无法在我的场景中使用 - 我需要在真实队列上工作的东西(就像ConsumingEnumerable
那样),但只枚举元素而不破坏(就像BlockingCollection.IEnumerable
那样)。
问题:
任何人都可以建议是否有一种方法可以在不编写自己的队列实现的情况下实现这一点(显然,当我们谈论多线程环境时,我认为这是一件相当令人沮丧的事情) - 这可以通过使用来实现BlockingCollection
,还是存在其他一些可以支持这种行为的集合?
[(*) 事实上,一个指定的消费者线程实际上有时可能会破坏元素(即调用Dequeue
)。但是,如果需要说此操作必须使所有其他消费者正在进行的枚举无效,我很好,因此可以将问题简化为假设消费者根本没有Dequeue
。]
解决方案
推荐阅读
- javascript - 在单击离开时选择下拉菜单时防止 Material UI 中的事件冒泡
- c# - C# PostAsync 调用永远不会返回结果
- html - 宽度 100% 为什么不是全宽以及如何?
- php - Sequelize 转换 UTF8 中的 DB 值,是吗?
- spring-batch - Spring批处理有状态处理器
- azure-active-directory - 权限不足,无法查看我创建的 Azure Kubernetes (AKS) 资源
- image - 在烧瓶中渲染静态文件:每个 slug 一个目录
- aws-amplify - 如何将 AWS Secret Manager 与 Amplify 结合使用
- javascript - 将 css 类添加到仅由它与 javascript 使用的 css 类的组合定义的 html div
- amazon-web-services - 带或不带服务过滤器的 ECS 指标