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

相关推荐
foundbug99917 小时前
自适应滤除直达波干扰的MATLAB实现
开发语言·算法·matlab
XDH_CS17 小时前
MySQL 8.0 安装与 MySQL Workbench 使用全流程(超详细教程)
开发语言·数据库·mysql
小短腿的代码世界18 小时前
Qt实时盈亏计算深度解析:从持仓数据到动态盈亏展示
开发语言·qt
小康小小涵18 小时前
基于ESP32S3实现无人机RID模块底层源码编译
linux·开发语言·python
lzjava202418 小时前
Python的函数
开发语言·python
Awesome Baron19 小时前
skill、tool calling、MCP区别
开发语言·人工智能·python
Python私教19 小时前
GenericAgent PySide6 桌面应用深度解析:悬浮按钮 + 聊天面板的原生 Qt 方案
开发语言·数据库·qt
矢志航天的阿洪19 小时前
用 MATLAB 控制 STK Aviator:从零搭建一个 AWACS 支援作战场景
开发语言·matlab
澈20719 小时前
STL迭代器:容器遍历的万能钥匙
开发语言·c++
AI人工智能+电脑小能手20 小时前
【大白话说Java面试题】【Java基础篇】第24题:Java面向对象有哪些特征
java·开发语言·后端·面试