簡體   English   中英

C#我如何平行IEnumerable的IEnumerable?

[英]C# how do I parallellize an IEnumerable of IEnumerable?

我有一個變量:

var contexts設置后是IEnumerable 這個對象的一個​​屬性也是我有的IEnumerable

Parallel.ForEach(contexts.AsParallel(), (context) =>
{
    Parallel.ForEach(context, (child) =>
    {

    });
});

但VS抱怨第二個ForEach

你試圖在這里應用太多的嵌套並行性。

Parallel.ForEach(   <-- #1
     contexts.AsParallel(), <-- #2
         (context) =>  {
        Parallel.ForEach( <- #3

假設這是CPU綁定工作,你真的不想這樣做。 這可能會創建太多需要映射到線程的任務,這將導致大量適得其反的上下文切換。

假設在最外層循環中具有相等卷的足夠數量的項目,那么最好將並行性保持在外部循環:

Parallel.ForEach(
  contexts, 
  context => { ...

(如果外環上的項目數不足以使所有內核保持忙碌,或者內部IEnumerable的項目分散不均勻並且會導致任務在不相等的時間內完成,那么請考慮使用@TheGeneral的使用思路contexts.SelectMany(c => c) ,即外形的形式outer.SelectMany(o => o.Inner) ,在並行化之前將嵌套集合展平為一個較大的集合。

如果仍然發現並發對於CPU綁定工作而言太高,則可以將其與目標計算機上的實際核心數相匹配,例如,如果您有8個可用核心:

Parallel.ForEach(
  contexts, 
  new ParallelOptions { MaxDegreeOfParallelism = 8 },  
  context => { ...

但是,如果要將其用於IO綁定工作,那么Parallel.For* / .AsParallel是錯誤的工具 - 使用異步並行工具,如Task.WhenAll

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM