Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行ForEach和队列_C#_Task Parallel Library - Fatal编程技术网

C# 并行ForEach和队列

C# 并行ForEach和队列,c#,task-parallel-library,C#,Task Parallel Library,是否可以对队列中的每个项目进行并行循环处理,以便: 仅删除正在处理的项目 暂停,直到新项目添加到队列中 编辑:这是关于System.Threading.Tasks的Parallel.ForEach功能的我认为如果队列具体实现是同步的,这是可能的,基本上这是一个消费者-生产者场景。听起来你在谈论一个典型的生产者/消费者场景。总是让我感到惊讶的是,在.Net中没有对这个模型的更直接的支持。我在.Net中遇到的最接近的一次是隐藏在并发和协调运行时中,它是Microsoft Robotics套件的一部分

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

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

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

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

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


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

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


    使用BlockingCollection这样的方法:

        var bc = new BlockingCollection<int>();
    Task.Factory.StartNew(() =>
        {
            ParallelOptions options = new ParallelOptions
                {
                    MaxDegreeOfParallelism = 30
                };
            Parallel.ForEach(bc.GetConsumingEnumerable(), options, i => { });
        });
    
    var bc=new BlockingCollection();
    Task.Factory.StartNew(()=>
    {
    ParallelOptions=新的ParallelOptions
    {
    MaxDegreeOfParallelism=30
    };
    Parallel.ForEach(bc.getconsumineGenumerable(),options,i=>{});
    });
    
    嗯?对不起,我一点也不明白:(如果我正确理解了你的问题,你想在2个不同的循环中迭代相同的队列,对吗?),因此基本上每个循环都有两个线程,为了工作,队列必须支持线程之间的同步。哦,对不起,我指的是System.Threading.Tasks的Parallel.ForEach func可选性。哦,我明白了,对不起,我不知道。好吧,这是反应式编程模型,RX是它的一个实现。谢谢HasanCheck也回答了这个问题:不,这个问题的答案太复杂了。反应式编程是解决方案。因此,任务将等到新项目放入集合后再继续g正确吗?