41

下面的代码片段之间有什么区别。如果是这样,是什么?

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

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

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

4

4 回答 4

23

Parallel.ForEach()正是针对这种代码的。

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

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

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

于 2013-01-08T13:17:08.207 回答
3

这是 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,所有线程都是基于请求的。调用者线程(main)被阻塞,直到 Parallel() 调用完成,这意味着所有子线程也应该已经完成​​。

如果调用者线程正在中止,这里有一个解释:

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

PLINQ 不会抢先中止线程,因为这样做很危险。相反,在取消时,它会等待每个工作线程在结束查询之前完成其当前元素。这意味着查询调用的任何外部方法都将运行完成。

于 2019-03-26T23:48:47.750 回答
3

正如C# Cookbook 中的并发所写:

与 PLINQ 之间的一个区别Parallel是 PLINQ 假设它可以使用计算机上的所有内核,同时Parallel会动态地对不断变化的 CPU 条件做出反应。

于 2021-01-03T19:54:18.337 回答
-1

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

于 2014-01-28T08:43:16.723 回答