在C#中,Parallel
类是 System.Threading.Tasks 命名空间下的一个静态类,它提供了并行执行循环和操作的简便方法。通过使用 Parallel
类,可以简化多线程编程,提高应用程序执行并行任务的能力。Parallel
类主要用于并行执行 for
和 foreach
循环。
Parallel
类包含几个静态方法,如 Parallel.For
、Parallel.ForEach
、Parallel.Invoke
等,这些方法能够自动将迭代分配给多个线程,以实现并行执行。
使用 Parallel.For
Parallel.For
方法用于并行执行 for
循环。它自动将循环的迭代分配给多个线程。
csharp
Parallel.For(0, 10, i =>
{
Console.WriteLine($"Iteration {i} is running on thread {Thread.CurrentThread.ManagedThreadId}");
});
使用 Parallel.ForEach
Parallel.ForEach
方法用于并行执行 foreach
循环。它同样自动将集合中的元素分配给多个线程。
csharp
var numbers = new List<int> { 1, 2, 3, 4, 5 };
Parallel.ForEach(numbers, number =>
{
Console.WriteLine($"Processing {number} on thread {Thread.CurrentThread.ManagedThreadId}");
});
使用 Parallel.Invoke
Parallel.Invoke
方法允许你并行执行多个操作。你可以传递多个要并行执行的 Action
或 Func
委托。
csharp
Parallel.Invoke(
() => { /* Task 1 */ },
() => { /* Task 2 */ },
() => { /* Task 3 */ }
);
示例
csharp
using System;
using System.Linq;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
// 创建一个包含 1 到 1000000 的整数列表
var numbers = Enumerable.Range(1, 1000000);
// 使用 Parallel.ForEach 并行计算每个整数的平方和
long totalSum = 0;
Parallel.ForEach(numbers, () => 0, (num, loopState, localSum) =>
{
// 计算当前整数的平方和
long square = num * num;
localSum += square;
return localSum;
},
(localSum) =>
{
// 将局部和累加到总和中
lock (numbers)
{
totalSum += localSum;
}
});
// 输出最终结果
Console.WriteLine("Total sum of squares: " + totalSum);
}
}
在上面的示例中,我们使用了 Parallel.ForEach 方法并行计算每个整数的平方和。首先,我们创建一个包含 1 到 1000000 的整数列表。然后,我们使用 Parallel.ForEach 方法并行遍历整数列表,并计算每个整数的平方和。在计算过程中,我们将每个线程计算得到的局部和累加到总和中,并使用 lock 关键字确保线程安全。
通过使用 Parallel 类并行计算,我们可以更快地完成对大规模数据集合的复杂计算,并且充分利用了多核处理器的性能,提高了计算效率。
注意事项
- 并行执行并不总是比串行执行更快。对于小型任务,线程创建和管理的开销可能会抵消并行执行带来的好处。
- 并行执行时,访问共享资源(如写入共享变量)需要额外的同步,否则可能导致数据竞争和其他并发问题。
- 使用
Parallel
类时,应确保你的代码是线程安全的,特别是在处理共享资源时。
Parallel
类是处理数据并行性的强大工具,可以显著提高性能,特别是在处理大量数据或执行密集计算任务时。然而,正确使用它需要对多线程编程有一定的理解。