0

0

C#怎么使用Parallel.ForEach C#并行循环加速处理

幻夢星雲

幻夢星雲

发布时间:2026-01-14 19:07:16

|

700人浏览过

|

来源于php中文网

原创

Parallel.ForEach可自动并行化CPU密集型任务,但需确保线程安全、避免共享状态、慎用于I/O场景;基本用法是替换foreach并使用System.Threading.Tasks;推荐用局部状态+合并方式处理聚合结果,配合ParallelOptions控制并发度,异常需捕获AggregateException并遍历InnerExceptions。

c#怎么使用parallel.foreach c#并行循环加速处理

Parallel.ForEach 能让集合遍历自动并行化,显著提升 CPU 密集型任务的执行速度,但不是所有场景都适合——关键看是否线程安全、有无共享状态、是否 I/O 主导。

基本用法:替换普通 foreach

把原来的串行循环改成并行,只需两步:

  • 引用 System.Threading.Tasks
  • Parallel.ForEach(集合, item => { /* 处理逻辑 */ }) 替代 foreach

例如处理一个整数列表求平方:

(注意:下面代码不涉及共享变量,是安全的)

var numbers = Enumerable.Range(1, 100000).ToList();
Parallel.ForEach(numbers, n => {
    var result = n * n; // 纯计算,无副作用
    // 可以写入线程本地变量或加锁写入共享结构
});

避免共享资源冲突:别直接改公共变量

多个线程同时写同一个变量(如 sum += n)会导致结果错误。正确做法有:

  • Interlocked.Add(ref sum, n) 原子操作(适合简单数值累加)
  • lock(obj) 包裹临界区(开销略大,但通用)
  • Parallel.ForEach 的重载 + 局部状态(推荐,性能最好)

局部状态示例(每个线程独立累加,最后合并):

萝卜简历
萝卜简历

免费在线AI简历制作工具,帮助求职者轻松完成简历制作。

下载
(适用于需要汇总结果的场景)

int total = Parallel.ForEach(
    numbers,
    () => 0, // 每个线程的局部初始值
    (n, loopState, localSum) => localSum + n * n, // 局部处理
    localSum => Interlocked.Add(ref total, localSum) // 合并到全局
);

控制并发度:防止线程过多拖慢性能

默认会根据 CPU 核心数动态调整线程数,但遇到大量小任务或内存敏感场景,可手动限制:

  • 传入 new ParallelOptions { MaxDegreeOfParallelism = 4 }
  • 一般设为 Environment.ProcessorCount 或略高,避免上下文切换开销
  • 特别耗内存的任务(如图像处理),适当调低更稳

提前退出和异常处理

不能用 breakreturn 直接跳出整个循环,但可以:

  • 调用 loopState.Break():通知后续分区尽快停止(已开始的仍会完成)
  • 调用 loopState.Stop():尽量立即中止所有未开始的迭代
  • 异常会被包装成 AggregateException,需 try-catch 并遍历 .InnerExceptions

例如查找第一个满足条件的元素:

int? found = null;
Parallel.ForEach(numbers, (n, loopState) => {
    if (n > 50000) {
        found = n;
        loopState.Stop(); // 不再启动新任务
    }
});

基本上就这些。用对了能快几倍,用错了反而更慢或出错——核心就三条:无共享写、合理控并发、异常要拆包。

相关专题

更多
php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

42

2025.12.04

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

118

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

255

2025.10.24

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

34

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

33

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

18

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.7万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号