AsParallel.ForAll vs Parallel.ForEach

本文关键字:ForEach Parallel vs ForAll AsParallel | 更新日期: 2023-09-27 17:50:54

下面的代码片段有什么不同吗?如果有,那是什么?

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

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

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

AsParallel.ForAll vs Parallel.ForEach

Parallel.ForEach()正是用于这种代码。

另一方面,ForAll()打算在(可能复杂的)PLINQ查询结束时使用。

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

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

MSDN中的解释:

https://learn.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不会先发制人地中止线程,因为有这样做。相反,在取消时,它等待每个工作线程以在结束查询之前完成其当前元素。这意味着查询调用的任何外部方法都将运行到完成。

在c# Cookbook中的并发编写:

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

您可以选择使用AsParallel(). asordered()对元素排序。并行排序。ForEach不是开箱的,我们需要这样做