在所有Linq查询中尝试使用Plinq是否可以?

时间:2010-05-23 21:55:06

标签: c# linq .net-4.0 task-parallel-library plinq

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

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

将plinq用作默认值会有什么陷阱?

1 个答案:

答案 0 :(得分:9)

一个陷阱是你失去了利用套装排序的能力。

请使用以下代码:

var results = new int { 0 ,1 ,2 ,3 };
var doSomethingSpecial = (from r in results.AsParallel() select r / 2).ToArray();

您不能指望按顺序排列的结果,因此结果可能是该集合的任何排列。这是最大的陷阱之一,从某种意义上讲,如果您处理有序数据,那么由于排序成本,您可能会失去性能优势。

另一个问题是你失去了捕获已知异常的能力。所以我无法捕获空指针异常(不是说你应该这样做)甚至是捕获FormatException。

有很多理由说明为什么你不应该总是在所有情况下使用Plinq,我将再强调一次。不要读到“自动使用非并行Linq”,它只能处理查询简单的障碍情况,或者太复杂而不能并行运行。

请记住,使用PLINQ越多,您将在服务器上消耗的资源就越多,而这些资源将从其他正在运行的线程中消失。

<强>资源:

MSDN PLNQ white paper

Paul Kimmel on PLINQ