代码之家  ›  专栏  ›  技术社区  ›  SnickersAreMyFave

parallel.foreach()与foreach(ienumerable<t>asparallel())

  •  139
  • SnickersAreMyFave  · 技术社区  · 14 年前

    ERG,我试图在BCL中找到这两种使用反射镜的方法,但找不到它们。这两个片段有什么区别?

    答:

    IEnumerable<string> items = ...
    
    Parallel.ForEach(items, item => {
       ...
    });
    

    B:

    IEnumerable<string> items = ...
    
    foreach (var item in items.AsParallel())
    {
       ...
    }
    

    使用一个对另一个有不同的后果吗?(假设我在两个示例的括号内的主体中所做的操作都是线程安全的。)

    3 回复  |  直到 9 年前
        1
  •  145
  •   svick bala    10 年前

    他们做的事情完全不同。

    第一个代理接受匿名委托,并为所有不同的项并行运行此代码上的多个线程。

    第二个在这个场景中不太有用。简而言之,它的目的是对多个线程进行查询,并组合结果,然后再次将其提供给调用线程。因此foreach语句上的代码始终保持在ui线程上。

    只有当您在 AsParallel() 打电话,像:

     var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));
    
        2
  •  49
  •   svick bala    13 年前

    区别在于,b不平行。唯一的事 AsParallel() 是不是包裹着 IEnumerable ,以便在使用LINQ方法时,使用它们的并行变量。包装的 GetEnumerator() (用于 foreach )甚至返回原始集合的结果 GET枚举器() .

    顺便说一句,如果你想看看Reflector中的方法, 并行() 是在 System.Linq.ParallelEnumerable 类中 System.Core 装配。 Parallel.ForEach() 是在 mscorlib 程序集(命名空间 System.Threading.Tasks )

        3
  •  47
  •   Scott Chamberlain    14 年前

    第二个方法将不会并行。在您的示例中使用asparallel()的正确方法是

    IEnumerable<string> items = ...
    
    items.AsParallel().ForAll(item =>
    {
        //Do parallel stuff here
    });