C# 多线程Paralle使用

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

Parallel 类包含几个静态方法,如 Parallel.ForParallel.ForEachParallel.Invoke 等,这些方法能够自动将迭代分配给多个线程,以实现并行执行。

使用 Parallel.For

Parallel.For 方法用于并行执行 for 循环。它自动将循环的迭代分配给多个线程。

Parallel.For(0, 10, i =>
{Console.WriteLine($"Iteration {i} is running on thread {Thread.CurrentThread.ManagedThreadId}");
});

使用 Parallel.ForEach

Parallel.ForEach 方法用于并行执行 foreach 循环。它同样自动将集合中的元素分配给多个线程。

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 委托。

Parallel.Invoke(() => { /* Task 1 */ },() => { /* Task 2 */ },() => { /* Task 3 */ }
);

示例

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序跳转防止页面栈卡死

小程序中页面栈为10个&#xff0c;超过10个之后小程序则无法进行跳转&#xff1b; 解决方法&#xff1a;进行页面栈判断有就返回&#xff0c;没有但没10个就navigateTo否则redirectTo&#xff1b; /*** 跳转定制历史*/ goCustomizeHistory() {let index getCurrentPages().f…

大自然的传奇——龙宫

我们1小时后就到了龙宫&#xff0c;导游给我们买票去了&#xff0c;让我们去观景台上&#xff0c;看游客中心后面“龙”字草书。龙字田采用两种农作物套种&#xff0c;按季节区分&#xff0c;春天由油菜花和蚕豆进行套种&#xff0c;秋天由黑糯米和一般水稻进行套种。我们来的夏…

json数据格式 继续学习

1.定义 轻量级的数据交互格式&#xff0c;可以按照json数据格式去组织和封装数据。 本质是一个带有特定格式的字符串。 2.功能 负责不同编程语言中的数据传递和交互。 3.json数据格式转化 """ 演示json数据和python字典之间的转换 """ impor…

【NPU 系列专栏 2.4 -- 高速互连 NVLink 详细介绍】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVLink 简介NVLink 主要特点NVLink 应用场景NVLink 工作原理NVLink 实例介绍DL 中使用 NVLinkHPC 中使用 NVLinkSummaryNVLink 简介 NVLink 是 NVIDIA 开发的一种高速互连技术,旨在提升 GPU 与 GPU 之间以及 GPU 与 CPU 之间的…

Spring Task详解

文章目录 一、开启定时任务二、cron表达式 Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑 一、开启定时任务 Spring Boot 默认在无任何第三方依赖的情况下使用 spring-context 模块下提供的定时任务工具 Spring Task。我们只…

帕金森病(PD)诊断:三种基于语音的深度学习方法

帕金森病&#xff08;Parkinson’s disease, PD&#xff09;是世界上第二大流行的神经退行性疾病&#xff0c;全球影响着超过1000万人&#xff0c;仅次于阿尔茨海默症。人们通常在65岁左右被诊断出患有此病。PD的一些症状包括震颤、肌肉僵硬和运动迟缓。这些症状往往出现在较晚…

MySQL之视图和索引实战

1.新建数据库 mysql> create database myudb5_indexstu; Query OK, 1 row affected (0.01 sec) mysql> use myudb5_indexstu; Database changed 2.新建表 1.学生表student&#xff0c;定义主键&#xff0c;姓名不能重名&#xff0c;性别只能输入男或女&#xff0c;所在…

Linux-Centos-改密码(单用户登陆)

笔记一&#xff1a; centos7单用户修改root密码 在CentOS 7中&#xff0c;如果您是唯一的用户或者您确信其他用户不会登录&#xff0c;您可以按照以下步骤来修改root密码&#xff1a; 1.重启系统。 2.启动时出现引导界面时&#xff0c;按任意键进入GRUB菜单。 3.选择要启动的内…

在线教育数仓项目(数据采集部分1)

文章目录 数据仓库概念项目需求及架构设计项目需求分析系统数据流程设计框架版本选型集群规模估算集群资源规划设计 数据生成模块目标数据页面事件曝光启动播放错误 数据埋点主流埋点方式&#xff08;了解&#xff09;埋点数据上报时机埋点数据日志结构 服务器和JDK准备服务器准…

缝缝补补的生活

工作之后荒废了生活&#xff0c;工作成了主旋律&#xff0c;没有兴趣、没有爱好、没有增长知识、没有丰富阅历浑浑噩噩的度过了工作后的近几年时间。有志之人立长志无志之人常立志&#xff0c;经常说重新开始&#xff0c;从头来过但是我们的生活从出生就是一直向前的&#xff0…

白鲸开源CEO郭炜荣获「2024中国数智化转型升级先锋人物」称号

2024年7月24日&#xff0c;由数据猿主办&#xff0c;IDC协办&#xff0c;新华社中国经济信息社、上海大数据联盟、上海市数商协会、上海超级计算中心作为支持单位&#xff0c;举办“数智新质力拓未来 2024企业数智化转型升级发展论坛——暨AI大模型趋势论坛”数据猿“年中特别策…

c语言(7.27)

今天学习了利用索引遍历第二种格式的二维数组 #include<stdio.h> int main() {//定义三个一维数组int arr1[3] { 1,2,3 };int arr2[5] { 1,2,3,4,5 };int arr3[9] { 1,2,3,4,5,6,7,8,9 };//分别算出每个一维数组的长度int len1 sizeof(arr1) / sizeof(int);int len2 …

探索 Electron:构建用户友好的登录页面流程

Electron是一个开源的桌面应用程序开发框架&#xff0c;它允许开发者使用Web技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;构建跨平台的桌面应用程序&#xff0c;它的出现极大地简化了桌面应用程序的开发流程&#xff0c;让更多的开发者能够利用已有的 Web 开发技能…

指针的面试题

这里写目录标题 判断链表中是否有环描述代码检测链表中是否存在环链表中存在环想检测链表中是否存在环&#xff0c;而不需要找到环的入口 判断链表中是否有环 题目 描述 判断给定的链表中是否有环。如果有环则返回true&#xff0c;否则返回false。 数据范围&#xff1a;链表…

精准制导:选择适合的Memcached缓存策略

&#x1f3af; 精准制导&#xff1a;选择适合的Memcached缓存策略 Memcached是一个广泛使用的高性能分布式内存缓存系统&#xff0c;它的缓存策略对于优化应用性能至关重要。正确的缓存策略可以显著减少数据库访问次数&#xff0c;降低延迟&#xff0c;提高响应速度。本文将深…

Spring Boot集成canal快速入门demo

1.什么是canal&#xff1f; canal 是阿里开源的一款 MySQL 数据库增量日志解析工具&#xff0c;提供增量数据订阅和消费。 工作原理 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志&#xff08;binary log&#xff09;, 日志中的记录叫做二进制日志事件&#xff…

二叉树_堆(下卷)

前言 接前面两篇的内容&#xff0c;接着往下讲二叉树_堆相关的内容。 正文 那么&#xff0c;回到冒泡排序与堆排序的比较。 我们知道冒泡排序的时间复杂度为 O ( N 2 ) O(N^2) O(N2)&#xff0c;这个效率是不太好的。 那么&#xff0c;我们的堆排序的时间复杂度如何呢&…

017、Vue动态tag标签

文章目录 1、先看效果2、代码 1、先看效果 2、代码 <template><div class "tags"><el-tag size"medium"closable v-for"item,index in tags":key"item.path":effect"item.title$route.name?dark:plain"cl…

特征工程的自动化革新:Mojo模型中的动态应用策略

特征工程的自动化革新&#xff1a;Mojo模型中的动态应用策略 在机器学习领域&#xff0c;特征工程是提升模型性能的黄金钥匙。Mojo模型&#xff0c;作为一个代表任何机器学习模型的术语&#xff0c;其性能在很大程度上依赖于特征的有效性。随着数据的不断变化和业务需求的演进…

数据结构 - AVL树

文章目录 一、AVL树的介绍二、AVL树的实现1、基本框架2、查找3、插入4、删除5、测试6、总代码 三、AVL树的性能 一、AVL树的介绍 1、概念 AVL树&#xff08;Adelson-Velsky and Landis Tree&#xff09;是一种自平衡的二叉搜索树。它得名于其发明者G. M. Adelson-Velsky和E. M…