![](/img/trans.png)
[英]Parallelizing a task using .AsParallel().ForAll or Parallel.ForEach performance issue
[英]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中的解释:
根据我阅读的内容,如果您想确保按顺序访问列表,请使用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.