我正在使用以下工作流程处理项目:
第一部分:
- 事件异步到达并在阻塞队列中排队,我们称之为Q1
- 线程从该队列中获取下一个可用项
- Item 最终并行运行 {N} 个任务
- 每个任务将其结果排入第二个队列,我们称之为Q2。
- 当项目处理完成时,下一个项目将从队列中读取。
第二部分:
- 另一个线程一次读取Q2一个对象并处理结果
所以,这里的问题是,第一个队列中的每个项目最终都会并行运行大量任务,并且每个任务都会将其结果排队。第二个队列必须连续处理,虽然一次处理一个项目,但它会被淹没。
我的问题
我需要一种机制,使线程处理 Q1 等待,直到 Q2 中的项目数低于特定阈值。实现这一目标的最佳方法是什么?有什么方法可以使用事件驱动解决方案而不是轮询解决方案吗?
最佳答案
而不是使用 Queue<T>
, 你可以使用 BlockingCollection<T>
对于第二季度。如果你设置它的 BoundedCapacity
, 调用 Q2.Add()
达到容量时会阻塞。这将自动限制 Q1 的处理,因为如果 N 任务无法添加到最终队列,它们将开始阻塞。
关于c# - 等待阻塞集合(队列)在 C# 中减小大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15253495/