C# 在所有Linq查询中尝试使用Plinq可以吗?

C# 在所有Linq查询中尝试使用Plinq可以吗?,c#,linq,.net-4.0,task-parallel-library,plinq,C#,Linq,.net 4.0,Task Parallel Library,Plinq,我读到PLinq会自动使用非并行Linq,如果它发现PLinq更昂贵。所以我想,为什么不在所有事情上使用PLinq(如果可能的话),让运行时决定使用哪一个 这些应用程序将部署到多核服务器上,我可以开发更多的代码来处理并行性 使用plinq作为默认设置有哪些缺陷?一个缺陷是您失去了利用集合排序的能力 以下面的代码为例: var results = new int { 0 ,1 ,2 ,3 }; var doSomethingSpecial = (from r in results.AsParall

我读到PLinq会自动使用非并行Linq,如果它发现PLinq更昂贵。所以我想,为什么不在所有事情上使用PLinq(如果可能的话),让运行时决定使用哪一个

这些应用程序将部署到多核服务器上,我可以开发更多的代码来处理并行性


使用plinq作为默认设置有哪些缺陷?

一个缺陷是您失去了利用集合排序的能力

以下面的代码为例:

var results = new int { 0 ,1 ,2 ,3 };
var doSomethingSpecial = (from r in results.AsParallel() select r / 2).ToArray();
您不能指望结果按顺序排列,因此结果可能是集合的任何排列。这是最大的陷阱之一,从某种意义上说,如果您处理的是有序数据,那么您可能会因为排序成本而失去性能优势

另一个问题是您失去了捕获已知异常的能力。因此,我无法捕获空指针异常(并不是说您应该这样做),甚至无法捕获格式化异常

在所有情况下都不应该总是使用Plinq有很多原因,我将再强调一个。不要将uch理解为“自动使用非并行Linq”,它只能处理查询过于简单或过于复杂而无法并行运行的障碍情况

请始终记住,使用PLINQ越多,您在服务器上消耗的资源就越多,这会占用其他正在运行的线程

资源:


对于有保证的排序,您可以只使用AsOrdered(),但您显然需要进行测量,以确定您在算法中是否获得了任何好处,因为这会增加开销。至于异常,如果并行执行中发生任何事情,您将获得AggregateException,您可以从中通过InnerExceptions属性获取发生的各个异常。与所有技术一样,要知道它是否会让您受益,唯一的方法就是使用代表您将在现实世界中处理的数据集进行实际测量。