繁体   English   中英

AsParallel.ForAll 与 Parallel.ForEach

[英]AsParallel.ForAll vs Parallel.ForEach

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

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

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

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

Parallel.ForEach()正是为这种代码设计的。

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

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

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

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

正如C# Cookbook中的Concurrency所写:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM