讲师中心 微信公众号
AI工具推荐 视频效率加速

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

老墨吖_2483

老墨吖_2483

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

|

366人浏览过

|

来源于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,导致程序崩溃。

IBKR Investing with Permission Gate
IBKR Investing with Permission Gate

通过IB网关在Interactive Brokers上投资股票/ETF,使用与okx交易相同的人机确认环节,适用于用户请求检查时

下载
  • 正确做法:用 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 )或单次耗时极短的操作(如简单加法),并行反而比普通 <code>for 慢 2–5 倍。

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

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

相关文章

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

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

下载

相关标签:

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

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

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

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

818

2025.12.04

登录token无效
登录token无效

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

14986

2023.09.14

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

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

1745

2023.09.14

token怎么获取
token怎么获取

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

4177

2023.12.21

token什么意思
token什么意思

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

6341

2024.03.01

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

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

3160

2025.10.15

java break和continue
java break和continue

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

847

2025.10.24

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

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

6667

2023.07.18

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB Reference Card
GDB Reference Card

共0课时 | 0人学习

《Debugging with GDB》用户手册
《Debugging with GDB》用户手册

共0课时 | 0人学习

Valgrind FAQ
Valgrind FAQ

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn