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正确吗?