下面的代码片段之间有什么区别。如果是这样,是什么?
myList.AsParallel().ForAll(i => { /*DO SOMETHING*/ });
和
Parallel.ForEach(mylist, i => { /*DO SOMETHING*/ });
主线程会等待所有子线程完成吗?在 MVC 应用程序中,如果我在控制器操作中进行并行处理,那么在主线程完成后子线程会发生什么。它们会被中止还是会在主线程完成后完成?
下面的代码片段之间有什么区别。如果是这样,是什么?
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,所有线程都是基于请求的。调用者线程(main)被阻塞,直到 Parallel() 调用完成,这意味着所有子线程也应该已经完成。
如果调用者线程正在中止,这里有一个解释:
http://www.albahari.com/threading/part5.aspx
PLINQ 不会抢先中止线程,因为这样做很危险。相反,在取消时,它会等待每个工作线程在结束查询之前完成其当前元素。这意味着查询调用的任何外部方法都将运行完成。
正如C# Cookbook 中的并发所写:
与 PLINQ 之间的一个区别
Parallel
是 PLINQ 假设它可以使用计算机上的所有内核,同时Parallel
会动态地对不断变化的 CPU 条件做出反应。
您可以选择使用 AsParallel().AsOrdered() 对元素进行排序。Parallel.ForEach 中的订购不是开箱即用的,我们需要这样做。