C#如何并行化IEnumerable中的IEnumerable?
我有一个变量:C#如何并行化IEnumerable中的IEnumerable?,c#,parallel-processing,C#,Parallel Processing,我有一个变量: var contexts其中after设置是一个IEnumerable。此对象上的属性之一也是IEnumerable我有: Parallel.ForEach(contexts.AsParallel(), (context) => { Parallel.ForEach(context, (child) => { }); }); 但是VS抱怨第二个ForEach您试图在这里应用太多嵌套并行 Parallel.ForEach( <--
var contexts
其中after设置是一个IEnumerable
。此对象上的属性之一也是IEnumerable
我有:
Parallel.ForEach(contexts.AsParallel(), (context) =>
{
Parallel.ForEach(context, (child) =>
{
});
});
但是VS抱怨第二个
ForEach
您试图在这里应用太多嵌套并行
Parallel.ForEach( <-- #1
contexts.AsParallel(), <-- #2
(context) => {
Parallel.ForEach( <- #3
(如果外环上的项目数不足以保持所有内核忙,或者如果内部代码< > Idababy中的项分散是不均匀的,并且会导致任务在不相等的时间内完成,那么考虑使用@ Tead一般的使用<代码>上下文的想法。SelectMany(C= >C),即窗体<代码> Out.SultMulk。(o=>o.Inner),以便在并行化之前将嵌套集合展平为一个更大的集合)
如果您仍然发现并发性对于CPU限制的工作来说太高,则可以将其与目标计算机上的实际内核数相匹配,例如,如果您有8个可用内核:Parallel.ForEach(
contexts,
new ParallelOptions { MaxDegreeOfParallelism = 8 },
context => { ...
但是,如果这是用于IO绑定的工作,那么
并行。对于*
/.aspallel
是错误的工具-使用异步并行工具,例如任务。当所有的“…但是VS投诉”-我确信它不会“投诉”但是给了你一个非常具体和解释性的错误信息。你能分享它吗?抱怨是什么?你的工作性质是什么,IO还是CPU?@一般来说,你的答案不差一半-如果外循环中没有足够的项,或者如果第二个循环中的子项分布不均匀,那么就把工作平铺使用.SelectMany
是一种很好的解决晚间事务的方法。@StuartLC是的,我放弃了这个答案,因为有太多的未知数和Parallel.ForEach(contexts.AsParallel()
把我吓到了X/Y领域,谢谢你的想法,但请注意,对于CPU限制的任务,建议不要使用maxdegreeofpparallelism
(对于不受CPU限制的任务,我会说,将其设置为CPU数量是无用的,因为它们将等待CPU之外的东西,如磁盘/网络)你说得对,一开始就变得聪明通常是个坏主意,除非你真的先分析了一些东西。每个记录的外部限制为最多15条记录,第二个限制为最多30条(用于分页)。对于返回的每个子记录,我需要执行进一步的操作。所有子记录都是独立的,因此希望使用并行而不是标准的foreach,然后使用单个外部的并行。For
很好:)
Parallel.ForEach(
contexts,
new ParallelOptions { MaxDegreeOfParallelism = 8 },
context => { ...