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

标签 c# .net multithreading queue event-driven

我正在使用以下工作流程处理项目:

第一部分:

  • 事件异步到达并在阻塞队列中排队,我们称之为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/

相关文章:

c# - 泛型不能显式转换类型

c# - 在 C# 中,将大文件加载到 winform richtextbox

c# - 从客户端通过 WCF 取消长时间运行的任务

c# - 通过windows服务打开浏览器渲染和截图selenium .Net中的webgl页面

c++ - 简单的定制互斥锁失败

c# - HelloWorld 多线程 C# 应用程序

c# - 为什么导出的报告是空的?

c# - 在 c# 中,我想在每次另一个整数增加一定数量时增加一个整数

c# - 将参数传递给 CosmosDB 存储过程

c# - 如何在 C# 中实现我自己的 TaS-Lock?