以下代码段之间是否有任何区别?如果是这样,是什么?
myList.AsParallel().ForAll(i => { /*DO SOMETHING*/ });
和
Parallel.ForEach(mylist, i => { /*DO SOMETHING*/ });
主线程是否会等待所有子线程完成?在MVC应用程序中,如果我在控制器操作中进行并行处理,主线程完成后子线程会发生什么。他们会被中止还是会在主线完成后完成?
答案 0 :(得分:22)
Parallel.ForEach()
完全适用于此类代码。
另一方面,ForAll()
旨在用于(可能是复杂的)PLINQ查询的末尾。
因此,我认为Parallel.ForEach()
是更好的选择。
在这两种情况下,当前线程将用于执行计算(以及线程池中的一些线程),并且该方法仅在所有处理完成后才返回。
答案 1 :(得分:3)
如Concurrency in C# Cookbook中所写:
<块引用>Parallel
和 PLINQ 之间的一个区别是 PLINQ 假设它可以使用计算机上的所有内核,而 Parallel
会动态响应不断变化的 CPU 条件。
答案 2 :(得分:0)
这是MSDN中的一种解释:
根据我的读物,如果要确保可以依次顺序访问列表,请使用Parallel.ForEach()
,而使用AsParallel.ForAll()
不能保证可以访问列表中的项目。订单。
对于MVC,所有线程均基于请求。调用程序线程(主线程)将被阻塞,直到完成Parallel()调用为止,这意味着所有子线程也应已完成。
如果调用方线程正在中止,则有一个解释:
http://www.albahari.com/threading/part5.aspx
PLINQ不会抢先中止线程,因为存在以下危险: 这样做。相反,在取消时它将等待每个工作线程 在结束查询之前以其当前元素结束。这表示 该查询调用的所有外部方法都将运行完毕。
答案 3 :(得分:-1)
您可以选择使用AsParallel()来排序元素.AsOrdered()。在Parallel.ForEach中排序不是开箱即用,我们需要这样做。