请说明在 C# 中,Parallel.For 与 Parallel.ForEach 各自的作用机制和使用方法,以及它们之间的区别和适用场景。
考察说明
考查对 C# 并行循环 API 的理解与正确使用。
回答思路
- 【回答框架 1】Parallel.For 是并行执行固定次数的迭代,每个迭代可能在不同线程上运行。它类似于 for 循环,但迭代顺序不保证。Parallel.ForEach 用于并行遍历 IEnumerable 或数组等集合,为每个元素执行操作。两者都来自 System.Threading.Tasks 命名空间。
- 【回答框架 2】使用时需注意线程安全,避免在迭代体中修改共享可变状态。可以设置 ParallelOptions 控制最大并行度或取消令牌。Parallel.ForEach 支持分区器(Partitioner)优化负载均衡,并提供了带有循环状态(如 Break、Stop)的重载用于提前终止。
- 【回答框架 3】区别在于 Parallel.For 适用于基于索引的循环,Parallel.ForEach 更灵活,适用于集合遍历。选择时考虑数据结构和并行度需求,性能需通过实际压测验证。
- 【回答框架 4】合理使用并行循环能提升多核利用率,但需权衡开销,小规模循环或轻量操作可能不适合。
- 【回答框架 5】可结合 CancellationTokenSource 实现优雅取消,并处理 AggregateException 捕获并行任务中抛出的异常。
- 【关键点 1】Parallel.For 并行执行固定次数迭代,适合索引型循环;Parallel.ForEach 并行遍历集合。
- 【关键点 2】迭代体必须线程安全,避免共享可变状态。
- 【关键点 3】可通过 ParallelOptions 控制最大并行度和取消。
- 【关键点 4】Parallel.ForEach 支持分区器优化,并提供 Break 和 Stop 等控制方法。
- 【关键点 5】异常需通过 AggregateException 捕获处理。
- 【易错点 1】忽略线程安全导致数据竞争,结果不可预测。
- 【易错点 2】对轻量或小规模循环使用并行,性能反降。
- 【易错点 3】未处理异常导致程序崩溃,需捕获 AggregateException。