0

0

c# 并行编程 Parallel.For 和普通 for 循环的区别

星降

星降

发布时间:2025-12-27 00:31:11

|

306人浏览过

|

来源于php中文网

原创

Parallel.For 自动并行但不保序,适用独立迭代;需防共享变量竞争、正确处理 AggregateException、显式传 CancellationToken 实现取消,小数据量或内存带宽瓶颈时性能可能下降。

c# 并行编程 parallel.for 和普通 for 循环的区别

Parallel.For 会自动分配线程,但不保证执行顺序

普通 for 循环是严格串行、按索引递增顺序执行的;Parallel.For 则把迭代范围切分成若干块,交由 ThreadPool 中的多个线程并行处理。这意味着:i 的实际执行顺序完全不可预测,甚至可能 i=100 先于 i=1 完成。

常见错误现象:在循环体里直接修改共享变量(如 sum += array[i]),没加锁或用原子操作,结果随机出错。

  • 适用场景:各次迭代完全独立,无读写竞争,比如批量图像缩放、数组元素逐个计算哈希
  • 不适用场景:需要按顺序累积状态(如前缀和)、依赖上一轮结果(如斐波那契递推)、或写入同一文件/数据库表且要求顺序落盘
  • 若必须保序且想并行,改用 Parallel.ForEach + AsOrdered()(性能代价大,慎用)

异常处理机制完全不同

普通 for 遇到异常立刻中断,堆清晰;Parallel.For 中任一线程抛出异常,整个操作会封装为 AggregateException 抛出,内含所有子异常。

典型错误:只用 try-catch(Exception) 捕获,漏掉外层 AggregateException,导致程序崩溃。

LuckyCola工具库
LuckyCola工具库

LuckyCola工具库是您工作学习的智能助手,提供一系列AI驱动的工具,旨在为您的生活带来便利与高效。

下载
  • 正确做法:用 try-catch(AggregateException ex),再遍历 ex.InnerExceptions 处理每个子异常
  • 也可用 ParallelOptions.MaxDegreeOfParallelism 限制并发数,降低异常爆发密度
  • 若某次迭代失败可忽略,应在循环体内自行 try-catch,避免污染整体执行

取消操作需显式传入 CancellationToken

普通 for 要中断只能靠 break 或条件判断;Parallel.For 支持协作式取消,但必须手动传入 CancellationToken,否则调用 cancellationTokenSource.Cancel() 没反应。

var cts = new CancellationTokenSource();
Parallel.For(0, 1000, new ParallelOptions { CancellationToken = cts.Token }, i =>
{
    if (cts.Token.IsCancellationRequested) return;
    // 实际工作
});
cts.Cancel(); // 此时正在执行的迭代会继续,新分配的迭代不再启动
  • CancellationToken 只影响任务调度,不强制终止正在运行的线程(.NET 不支持强行 Abort)
  • 循环体内需主动检查 Token.IsCancellationRequested 并及时退出,否则无法响应取消
  • 未传 ParallelOptions 时,默认无取消支持,Cancel() 完全无效

性能不是“开并行就一定快”,小数据量反而更慢

Parallel.For 启动有开销:任务拆分、线程调度、同步协调。对少量迭代(比如 for (i = 0; i )或单次耗时极短的操作(如简单加法),并行反而比普通 for 慢 2–5 倍。

  • 经验阈值:单次迭代平均耗时 > 1ms 且总迭代数 > 100 时,并行才大概率带来收益
  • Stopwatch 实测对比,别凭感觉——尤其注意首次运行受 JIT 影响,应预热后测
  • 内存带宽瓶颈时(如大量数组拷贝),增加线程数可能因争抢缓存而降速

真正难的是识别「哪些迭代能并行」和「哪些共享状态必须保护」,而不是换一个关键字。写完 Parallel.For 后,务必验证结果正确性、异常行为、取消响应和真实负载下的性能表现。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

36

2025.12.04

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6029

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

778

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1044

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1064

2024.03.01

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

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

116

2025.10.15

java break和continue
java break和continue

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

253

2025.10.24

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

361

2023.07.18

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

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

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