C# 多线程Paralle使用

在C#中,Parallel 类是 System.Threading.Tasks 命名空间下的一个静态类,它提供了并行执行循环和操作的简便方法。通过使用 Parallel 类,可以简化多线程编程,提高应用程序执行并行任务的能力。Parallel 类主要用于并行执行 forforeach 循环。

Parallel 类包含几个静态方法,如 Parallel.ForParallel.ForEachParallel.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 方法允许你并行执行多个操作。你可以传递多个要并行执行的 ActionFunc 委托。

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 类是处理数据并行性的强大工具,可以显著提高性能,特别是在处理大量数据或执行密集计算任务时。然而,正确使用它需要对多线程编程有一定的理解。

相关推荐
Bruce_Liuxiaowei9 分钟前
PHP文件包含漏洞详解:原理、利用与防御
开发语言·网络安全·php·文件包含
泽020218 分钟前
C++之STL--list
开发语言·c++·list
YGGP22 分钟前
吃透 Golang 基础:数据结构之 Map
开发语言·数据结构·golang
~plus~24 分钟前
Harmony核心:动态方法修补与.NET游戏Mod开发
开发语言·jvm·经验分享·后端·程序人生·c#
步、步、为营30 分钟前
.NET 事件模式举例介绍
java·开发语言·.net
htj1032 分钟前
C# 使用正则表达式
正则表达式·c#
~plus~33 分钟前
WPF八大法则:告别模态窗口卡顿
开发语言·经验分享·后端·程序人生·c#
就是有点傻42 分钟前
使用WPF的Microsoft.Xaml.Behaviors.Wpf中通用 UI 元素事件
c#
march of Time43 分钟前
go工具库:hertz api框架 hertz client的使用
开发语言·golang·iphone
24K纯学渣1 小时前
Python编码格式化之PEP8编码规范
开发语言·ide·python·pycharm