【问题标题】:Parallel ForEach, and Queues并行 ForEach 和队列
【发布时间】:2012-05-05 20:25:57
【问题描述】:

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

  1. 仅删除正在处理的项目
  2. 暂停,直到将新项目添加到队列中

编辑:这是关于 System.Threading.Tasks 的 Parallel.ForEach 功能

【问题讨论】:

标签: c# task-parallel-library


【解决方案1】:

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

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

【讨论】:

  • 好的,这是响应式编程模型,RX 是它的实现。谢谢哈桑
【解决方案2】:

像这样使用 BlockingCollection:

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

【讨论】:

  • 因此任务将等到新项目被放入集合中后再继续正确?
【解决方案3】:

我认为如果队列具体实现是同步的就可以了,基本上这是一个消费者-生产者的场景。

【讨论】:

  • 呃?对不起,我根本不明白:(
  • 如果我正确理解了你的问题,你想为每个循环在 2 个不同的地方迭代同一个队列,对吗?所以基本上你会有两个线程分别为每个循环执行它,这样才能工作队列必须支持线程之间的同步。
  • 哦,抱歉,我指的是 System.Threading.Tasks 的 Parallel.ForEach 功能。
  • 哦,我明白了,抱歉不知道。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2012-03-17
    相关资源
    最近更新 更多