【发布时间】:2012-05-05 20:25:57
【问题描述】:
是否可以让每个循环并行处理队列中的项目,以便:
- 仅删除正在处理的项目
- 暂停,直到将新项目添加到队列中
编辑:这是关于 System.Threading.Tasks 的 Parallel.ForEach 功能
【问题讨论】:
-
不,这个问题的答案太复杂了。反应式编程是解决方案。
是否可以让每个循环并行处理队列中的项目,以便:
编辑:这是关于 System.Threading.Tasks 的 Parallel.ForEach 功能
【问题讨论】:
使用响应式扩展订阅队列并执行新任务中的每个项目。 您不必阻止或等待新项目,因为它将被推送到您的订阅 lambda,并且您的执行/处理将是并行的。
【讨论】:
像这样使用 BlockingCollection:
var bc = new BlockingCollection<int>();
Task.Factory.StartNew(() =>
{
ParallelOptions options = new ParallelOptions
{
MaxDegreeOfParallelism = 30
};
Parallel.ForEach(bc.GetConsumingEnumerable(), options, i => { });
});
【讨论】:
我认为如果队列具体实现是同步的就可以了,基本上这是一个消费者-生产者的场景。
【讨论】:
听起来您在谈论经典的生产者/消费者情况。让我感到惊讶的是,没有对 .Net 中内置的这种模型更直接的支持。我在 .Net 中遇到的最接近的一次是隐藏在并发和协调运行时中,它是 Microsoft Robotics 套件的一部分。祝你现在找到它。
但是,一旦您知道要搜索什么,快速的 Google 检查确实会提供一些其他潜在选择。
【讨论】: