Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 天门冬等径与平行径_C#_Parallel Processing_Task Parallel Library - Fatal编程技术网

C# 天门冬等径与平行径

C# 天门冬等径与平行径,c#,parallel-processing,task-parallel-library,C#,Parallel Processing,Task Parallel Library,下面的代码片段之间有什么区别吗。如果是,什么 myList.AsParallel().ForAll(i=>{/*DO SOMETHING*/}) 及 Parallel.ForEach(mylist,i=>{/*DO SOMETHING*/}) 主线程是否会等待所有子线程完成?在MVC应用程序中,如果我在控制器操作中执行并行处理,那么在主线程完成后,子线程会发生什么情况。它们将被中止还是在主线程完成后也将被完成?并行。ForEach()正是为这种代码设计的 另一方面,ForAll() 因此,我认为

下面的代码片段之间有什么区别吗。如果是,什么

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

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

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

并行。ForEach()
正是为这种代码设计的

另一方面,
ForAll()

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


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

您可以选择使用AsParallel()对元素进行排序。AsOrdered()。并行订购。ForEach不是现成的,我们需要这样做。

以下是MSDN中的解释:

根据我读到的内容,如果要确保列表按顺序访问,请使用
Parallel.ForEach()
,而使用
AsParallel.ForAll()
不保证列表中的项目按顺序访问

对于MVC,所有线程都是基于请求的。调用线程(main)被阻塞,直到Parallel()调用完成,这意味着所有子线程也应该完成

如果调用方线程正在中止,下面是一个解释:

PLINQ不会抢先中止线程,因为存在 这样做。相反,在取消时,它会等待每个工作线程 在结束查询之前完成其当前元素。这意味着 查询调用的任何外部方法都将运行到完成

如所述:

Parallel
和PLINQ之间的一个区别是,PLINQ假设它可以使用计算机上的所有内核,而
Parallel
将动态地响应CPU条件的变化


我建议你读一读:如果我是你,我会为你的MVC并行处理提出另一个问题。请小心Asparell().ForAll(),因为它会导致不可预测的结果。例如,我有一个按钮在单击时执行此代码:myEnumerable.AsParallel().ForAll(I as string=>otherDictionary.Add(I,0))。它会将null作为键添加到otherDictionary。我必须重写才能使用foreach循环。奇怪。@YukiSakura,也许你没有用字典?我认为我们不应该因为没有完整示例的注释而害怕使用代码。最好将您的问题作为单独的问题发布。为什么ForAll()用于PLINQ查询的结尾?@AranMulholland根据parallel使用的并行查询。Foreach()必须支付两次并行化的费用。而ForAll()使用查询中的现有分区/线程。我猜由于
Parallel.ForEach()
来自
System.Threading.Tasks
命名空间,因此它更可能与任务相关。而
aspallel().ForAll
来自
System.Linq
命名空间,因此更适合与PLINQ一起使用。@Ben我不太明白
ForAll
是PLINQ的一部分。我不知道“与任务相关”是什么意思。
AsOrdered()
影响结果的顺序。由于
ForAll()
没有任何结果,
AsOrdered()
在这里没有任何效果。如果你说的是处理的顺序,那么这只适用于单线程计算。我是说你使用ForAll()和AsOrdered()吗?请检查一下。对不起,我弄错了。但是将AsOrdered与Parallel.ForEach一起使用更有意义,因为原始的非并行集合已经被排序,所以添加.AsParallel().AsOrdered()不会有任何效果。此外,尝试对并行计算进行排序几乎没有意义。