Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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#如何并行化IEnumerable中的IEnumerable?_C#_Parallel Processing - Fatal编程技术网

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 => { ...