C# PLINQ(并行LINQ)入门 - 轻松提升查询性能

来源:这里教程网 时间:2026-02-21 17:40:06 作者:

PLINQ 是 LINQ 的并行版本,能自动将查询拆分到多个 CPU 核心上执行,适合处理大量数据的 CPU 密集型查询。它不是万能加速器,用错反而变慢,关键在“合适场景”和“正确写法”。

什么时候该用 PLINQ?

适合以下情况:

数据量大(通常 > 10,000 条,且每项计算较耗时) 查询逻辑是纯函数式(无共享状态、不修改外部变量、无副作用) 瓶颈在 CPU 而非 I/O(比如字符串解析、数学计算、对象映射) 结果顺序不敏感,或你明确用 AsOrdered() 保序(但会略降性能)

不适合:频繁锁操作、依赖上下文(如数据库连接)、小数据集、本身已 I/O 瓶颈的场景。

三步启用 PLINQ

只需在数据源后加一个方法调用:

AsParallel():开启并行(必须第一步) 后续链式调用普通 LINQ 方法(Where、Select、Aggregate 等)——它们会自动并行执行 最后调用 ToList() / ForAll() / Sum() 等终结操作触发执行

示例:var result = numbers.AsParallel().Where(x => IsPrime(x)).Select(x => x * x).ToList();

避坑要点

常见错误会引发异常或结果错误:

别在并行流中直接修改共享变量(如 int count = 0; ... .ForAll(x => count++);)→ 改用 AggregateConcurrentBag 避免在 Where/Select 中调用非线程安全方法(如操作静态 Random 实例)→ 每次新建实例或用 ThreadLocal 慎用 AsOrdered():只在真需要原顺序时加,它会引入额外同步开销 超时或取消?传入 ParallelOptions 并设置 CancellationToken

简单对比:LINQ vs PLINQ

同一筛选+变换操作,10 万整数求平方:

普通 LINQ:单线程,稳定但慢 PLINQ(默认):多核跑满,提速约 2–3 倍(4 核机器) PLINQ + AsOrdered():速度略低于默认 PLINQ,但结果顺序一致

提速不是线性的,受数据分布、CPU 缓存、GC 压力等影响。建议用 Stopwatch 实测,别猜。

基本上就这些。PLINQ 不复杂但容易忽略适用边界,先判断场景,再加 AsParallel(),最后验证结果和性能——稳了。

相关推荐