等待阻塞集合(队列)在C#中减小

Joh*_*0te 6 .net c# queue multithreading event-driven

我正在使用以下工作流程开展项目:

第一部分:

  • 事件异步到达并在阻塞队列中排队,我们称之为Q1
  • 线程从该队列中获取下一个可用项
  • 项目最终并行运行{N}个任务
  • 每个任务将其结果排队到第二个队列,我们​​称之为Q2.
  • 处理完项目后,将从队列中读取下一个项目.

第二部分:

  • 另一个线程一次读取Q2一个对象并处理结果

因此,问题在于,第一个队列中的每个项目最终并行运行大量任务,并且每个任务将其结果排队.第二个队列必须连续处理,一次一个项目,然后它被淹没.


我的问题

我需要一种机制,使线程处理Q1等待,直到Q2中的项数低于特定的阈值.实现这一目标的最佳方法是什么?有没有办法让事件驱动的解决方案而不是轮询解决方案?

Ree*_*sey 8

不使用a Queue<T>,你可以使用BlockingCollection<T>for Q2.如果设置了它BoundedCapacity,Q2.Add()则会在达到容量时阻止调用.这将自动限制Q1的处理,因为如果N个任务无法添加到最终队列,它们将开始阻塞.