TaskFactory.Tasks中的BlockingCollection.GetConsumingEnumerable()集合的Parallel.ForEach和foreach循环
|
我已经对这两个循环进行了实验,发现即使Task \的Action委托中的常规foreach循环应该并行执行,也不会并行处理元素。但是,如果我用Parallel.ForEach替换它,我看到数据正在跨多个线程并行处理。
代码1:
Task loadingTask1 = Factory.StartNew(() =>
{
foreach (MyOneClass dg in Queue.GetConsumingEnumerable())
{
MyOtherClass vl = new MyOtherClass();
vl.Id = dg.Id;
vl.PerformTimeConsumingAction();
OutputQueue.Add(vl);
}
});
代码2:
Task loadingTask2 = Factory.StartNew(() =>
{
Parallel.ForEach(Queue.GetConsumingEnumerable(), (dg) =>
{
MyOtherClass vl = new MyOtherClass();
vl.Id = dg.Id;
vl.PerformTimeConsumingAction();
OutputQueue.Add(vl);
});
});
在每次迭代中使用Console.Write语句运行时,代码1似乎正在等待上一个周期完成,直到抓住下一个周期为止,但是代码2确实并行处理多个元素。
我是否无法正确理解Task.Action中的常规foreach?我以为.NET将按照负载保证启动尽可能多的线程来执行任务,并且foreach的每次迭代都将并行处理。
我也尝试过将PLINQ结果传递给上述代码,并且观察者具有相同的行为:即使我使用了.AsParallel()
和.WithExecutionMode(ParallelExecutionMode.ForceParallelism)
指令,常规的foreach似乎也在等待上一个迭代完成以开始下一个迭代。
任何见解将不胜感激。
我知道OrderingPartitioner类,可以尝试使用它
没有找到相关结果
已邀请:
1 个回复
癸痊醒
的执行流程如下所示:
希望能帮助您了解正在发生的事情。