Parallel.ForEach
是 C# 中 System.Threading.Tasks.Parallel
类提供的一个方法,用于并行地迭代集合中的每一个元素。Parallel.ForEach
方法允许多个线程同时处理集合中的元素,从而提高程序的执行效率,特别是在处理大量数据或执行耗时任务时。
语法
Parallel.ForEach
的基本语法如下:
Parallel.ForEach(source, body);
其中:
source
:要迭代的集合。body
:一个委托,定义了对集合中每个元素的操作。
设置最大并行度
示例中,Parallel.ForEach
方法还接收了一个 ParallelOptions
对象,用于设置并行执行的选项。特别地,MaxDegreeOfParallelism
属性指定了同时执行的最大线程数。在这个例子中,MaxDegreeOfParallelism
被设置为 16,这意味着最多同时有 16 个线程并行执行。
示例代码
下面是提供的代码示例的完整形式:
using System;
using System.Diagnostics;
using System.Threading.Tasks;
class Program
{
static void Main()
{
var tPAgvTasksList = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 示例数据
// 并行迭代 tPAgvTasksList 集合中的每一个元素
Parallel.ForEach(
tPAgvTasksList,
new ParallelOptions() { MaxDegreeOfParallelism = 16 },
item =>
{
// 代码块
Console.WriteLine($"Processing item {item} on thread {Thread.CurrentThread.ManagedThreadId}");
DoSomeWork(item);
}
);
Console.WriteLine("All tasks completed.");
}
static void DoSomeWork(int item)
{
// 模拟耗时操作
Thread.Sleep(1000);
}
}
解释
-
Parallel.ForEach 方法:
Parallel.ForEach
方法接收三个参数:一个集合tPAgvTasksList
,一个ParallelOptions
对象,以及一个 Lambda 表达式来定义每个元素的处理逻辑。
-
ParallelOptions 对象:
new ParallelOptions() { MaxDegreeOfParallelism = 16 }
:设置并行执行的最大线程数为 16。这意味着在任何时刻最多有 16 个线程在执行。
-
Lambda 表达式:
item => { /* 代码块 */ }
:定义了对集合中每个元素item
的处理逻辑。在这个例子中,每个元素被打印出来,并执行了一个模拟的耗时操作DoSomeWork
。
-
DoSomeWork 方法:
DoSomeWork
方法模拟了一个耗时的操作,比如数据库访问、文件读写或其他 I/O 操作。
优点
使用 Parallel.ForEach
的主要优点包括:
- 提高性能:通过并行处理多个任务,可以显著提高程序的执行效率。
- 简化编程模型:无需显式管理线程,
Parallel.ForEach
自动管理线程池中的线程。
注意事项
-
资源竞争:
- 如果并行度设置过高,可能会导致系统资源(如 CPU 时间片、内存)的竞争,反而降低程序性能。
-
线程安全:
- 在并行执行时,需要注意对共享资源的访问,避免竞态条件(race condition)。可以使用锁(
lock
)、原子操作(Interlocked
类)或其他并发集合(如ConcurrentQueue
)来保证线程安全。
- 在并行执行时,需要注意对共享资源的访问,避免竞态条件(race condition)。可以使用锁(
-
异常处理:
- 并行任务中发生的异常不会立即抛出,而是被捕获并在所有任务完成后统一处理。可以通过
Parallel.ForEach
的重载版本添加异常处理逻辑。
- 并行任务中发生的异常不会立即抛出,而是被捕获并在所有任务完成后统一处理。可以通过
总结
Parallel.ForEach
提供了一种简便的方法来并行处理集合中的元素,通过设置 MaxDegreeOfParallelism
可以控制并行执行的最大线程数。这种技术非常适合处理大规模数据集或执行耗时的任务,可以显著提升程序的性能。