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应用程序中,如果我在控制器操作中进行并行处理,那么主线程完成后子线程会发生什么?它们会被中止还是在主线程完成后才被完成?
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.aspxPLINQ不会先发制人地中止线程,因为有这样做。相反,在取消时,它等待每个工作线程以在结束查询之前完成其当前元素。这意味着查询调用的任何外部方法都将运行到完成。
在c# Cookbook中的并发编写:
Parallel
和PLINQ之间的一个区别是,PLINQ假设它可以使用计算机上的所有内核,而Parallel
将动态响应不断变化的CPU条件。
您可以选择使用AsParallel(). asordered()对元素排序。并行排序。ForEach不是开箱的,我们需要这样做