当前位置:首页 > C# > 正文

C# Parallel.ForEach 详解(小白也能掌握的并行处理集合技巧)

在 C# 开发中,当我们需要对大量数据进行处理时,传统的 foreach 循环可能会因为单线程执行而显得效率低下。这时,C# Parallel.ForEach 就派上用场了!它能帮助我们轻松实现并行处理集合,大幅提升程序性能。本文将从零开始,手把手教你如何使用 Parallel.ForEach 进行多线程编程C#,即使是编程新手也能轻松上手。

C# Parallel.ForEach 详解(小白也能掌握的并行处理集合技巧)  并行处理集合 多线程编程C# 高性能C#循环 第1张

什么是 Parallel.ForEach?

Parallel.ForEach 是 .NET Framework 4.0 引入的 System.Threading.Tasks.Parallel 类中的一个静态方法,用于对集合中的每个元素并行执行操作。与普通 foreach 不同,它会自动利用多个 CPU 核心,将任务分配到多个线程中同时执行,从而实现高性能C#循环

基本语法

最简单的用法如下:

using System;using System.Collections.Generic;using System.Threading.Tasks;List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };Parallel.ForEach(numbers, number =>{    Console.WriteLine($"处理数字: {number}, 线程ID: {Task.CurrentId}");});

运行这段代码,你会发现输出顺序是乱的,并且每个任务可能由不同的线程执行(通过 Task.CurrentId 可以看到线程 ID)。这正是并行处理的特点:不保证顺序,但速度快!

注意事项:线程安全问题

由于多个线程同时运行,如果你在循环体中修改共享变量(如累加、写入同一个列表等),就可能出现线程安全问题。例如:

// ❌ 错误示例:非线程安全int sum = 0;Parallel.ForEach(numbers, n =>{    sum += n; // 多个线程同时修改 sum,结果不可预测!});

正确做法是使用线程本地变量或锁机制。推荐使用 Interlockedlock,或者更好的方式是使用 Parallel.ForEach 的重载版本支持局部状态:

// ✅ 正确示例:使用局部状态object lockObj = new object();int total = 0;Parallel.ForEach(numbers, () => 0, (n, loopState, localSum) =>{    return localSum + n;},localFinalSum =>{    lock (lockObj)    {        total += localFinalSum;    }});Console.WriteLine($"总和: {total}");

何时使用 Parallel.ForEach?

  • 集合元素数量大(通常 > 1000)
  • 每个元素的处理逻辑耗时较长(如 I/O 操作、复杂计算)
  • 操作之间相互独立,无强顺序依赖

如果只是简单打印或轻量操作,使用 Parallel.ForEach 反而可能因线程调度开销导致性能下降。因此,请根据实际场景权衡使用。

总结

Parallel.ForEach 是 C# 中实现并行处理集合的强大工具,能显著提升程序性能。但要注意线程安全问题,并合理评估是否真的需要并行化。掌握这项技术,你就能写出更高效的高性能C#循环代码!

希望这篇教程能帮助你理解 C# Parallel.ForEach多线程编程C# 的核心概念。快去试试吧!