AsParallel.ForAll vs Parallel.ForEach

时间:2013-01-08 01:14:23

标签: c# parallel-processing task-parallel-library

以下代码段之间是否有任何区别?如果是这样,是什么?

myList.AsParallel().ForAll(i => { /*DO SOMETHING*/ });

Parallel.ForEach(mylist, i => { /*DO SOMETHING*/ });

主线程是否会等待所有子线程完成?在MVC应用程序中,如果我在控制器操作中进行并行处理,主线程完成后子线程会发生什么。他们会被中止还是会在主线完成后完成?

4 个答案:

答案 0 :(得分:22)

Parallel.ForEach()完全适用于此类代码。

另一方面,ForAll()旨在用于(可能是复杂的)PLINQ查询的末尾。

因此,我认为Parallel.ForEach()是更好的选择。

在这两种情况下,当前线程将用于执行计算(以及线程池中的一些线程),并且该方法仅在所有处理完成后才返回。

答案 1 :(得分:3)

Concurrency in C# Cookbook中所写:

<块引用>

Parallel 和 PLINQ 之间的一个区别是 PLINQ 假设它可以使用计算机上的所有内核,而 Parallel 会动态响应不断变化的 CPU 条件。

答案 2 :(得分:0)

这是MSDN中的一种解释:

https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/potential-pitfalls-with-plinq#prefer-forall-to-foreach-when-it-is-possible

根据我的读物,如果要确保可以依次顺序访问列表,请使用Parallel.ForEach(),而使用AsParallel.ForAll()不能保证可以访问列表中的项目。订单。

对于MVC,所有线程均基于请求。调用程序线程(主线程)将被阻塞,直到完成Parallel()调用为止,这意味着所有子线程也应已完成。

如果调用方线程正在中止,则有一个解释:

http://www.albahari.com/threading/part5.aspx

  

PLINQ不会抢先中止线程,因为存在以下危险:   这样做。相反,在取消时它将等待每个工作线程   在结束查询之前以其当前元素结束。这表示   该查询调用的所有外部方法都将运行完毕。

答案 3 :(得分:-1)

您可以选择使用AsParallel()来排序元素.AsOrdered()。在Parallel.ForEach中排序不是开箱即用,我们需要这样做。