并行ForEach和队列

时间:2011-07-01 02:02:05

标签: c# task-parallel-library

是否可以为每个循环处理并行处理队列中的项目:

  1. 仅删除正在处理的项目
  2. 暂停,直到将新项目添加到队列
  3. 编辑:这是关于System.Threading.Tasks的Parallel.ForEach功能

4 个答案:

答案 0 :(得分:8)

使用Reactive Extensions订阅队列并执行新任务中的每个项目。 您不必阻止或等待新项目,因为它将被推送到您的订阅lambda并且您的执行/处理将是并行的。

http://rxwiki.wikidot.com/101samples

答案 1 :(得分:1)

使用类似这样的BlockingCollection:

    var bc = new BlockingCollection<int>();
Task.Factory.StartNew(() =>
    {
        ParallelOptions options = new ParallelOptions
            {
                MaxDegreeOfParallelism = 30
            };
        Parallel.ForEach(bc.GetConsumingEnumerable(), options, i => { });
    });

答案 2 :(得分:0)

我认为如果队列具体实现是同步的,那么基本上这是消费者 - 生产者场景。

答案 3 :(得分:0)

听起来你在谈论一个典型的生产者/消费者情况。令人惊讶的是,对于内置于.Net的这个模型没有更多的直接支持。我在.Net中遇到的最接近的一次隐藏在并发和协调运行时内,它是Microsoft Robotics套件的一部分。祝你现在好运。

但是一旦你知道要搜索什么,快速谷歌检查确实提供了一些其他潜在的选择。