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

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

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

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

默认使用 plinq 有哪些陷阱?

最佳答案

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

采用以下代码:

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

关于c# - 尝试在所有 Linq 查询中使用 Plinq 是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2893637/

相关文章:

c# - 单个类项目中的可访问性级别

c# - 如何配置 swig 以在 64 位平台中将 size_t 映射为 ulong 而不是 uint (c#)

c# - 将 IGrouping 转换为 IQueryable

c# - 在 LINQ 中使 UNION 查询更高效

c# - "where T : X, new()"还是 "where T : new(), X"?

c# - 呈现为 XPS 时如何创建带有页眉和页脚的 Xaml FlowDocument?

C# 套接字 如何处理套接字服务器上的计划外断开连接?

c# - 如何清除所选项目 Xamarin 列表

c# - 异步拖放到 Windows 资源管理器

c# - 获取类类型?