使用 Parallel 类进行多线程编码(上)

        用 C# 进行多线程编程有很多方式,比如使用 Thread 对象开启一个新线程,但这已经是一种落后的写法了,现在推荐的写法是使用 Parallel 类,它可以让我们像写传统代码一样编写多线程的程序,Parallel 类有三个常用的方法如下:

  • Parallel.For():开启多线程循环执行一段代码
  • Parallel.ForEach():开启多线程遍历处理一个对象集合
  • Parallel.Invoke():开启多线程执行多个方法

        下面我们来看看如何使用它们。 

1.Parallel.For()的使用

        新建一个.net6.0的 控制台应用项目,在项目根目录下新增类 ConcurrencyDemo.cs 用来演示,如下:

         在 ConcurrencyDemo.cs 中新增方法 ParallelForPrint(),其作用是调用 Parallel.For() 循环输出1~9,如下:

public void ParallelForPrint()
{Parallel.For(1, 10, i => {Console.WriteLine(string.Format("  i = {0}", i));});
}

        此方法有3个参数,第1个是循环的起始值,第2个是结束值,第3个是要执行的动作,这里用 Lambda 表达式输出 i.

        在 Program.cs 的 Main() 方法中调用,代码如下:

static void Main(string[] args)
{Console.WriteLine("Hello World!");ParallelDemo pdemo = new ParallelDemo();pdemo.ParallelForPrint();Console.ReadLine();
}

         编译后运行程序,得到如下结果:

        可以看到,并没有按顺序输出1~9,因为多线程的其中一个特点就是乱序执行,代码的执行顺序是不可控的。

        下面我们将方法稍作修改,并与 for 循环做一下对比,看使用 Parallel.For() 做多线程编程比用传统的 for 能快多少。

         编译后运行程序,得到如下结果:

         和我们期望的不一样,使用 Parallel.For() 花费了更多的时间。如果我们将循环的次数由 20000 改为 20 时候,结果如下:

        使用 Parallel.For() 花费的时间依然比 for 多。这说明 Parallel.For() 的使用是有条件的,如果循环内的代码运行的时间很短,它反而更慢,这是因为使用多线程的时候,线程的创建、撤销等是有时间开销的。

        下面我们再对方法做一下修改,在循环体内让当前线程休眠 10 毫秒,代码如下,看看会发生什么:

public void ParallelForCompareFor(){//计算 Parallel.For() 的时间int total1 = 0;Stopwatch watch1 = new Stopwatch();watch1.Start(); //开始计时Parallel.For(1, 20000, i => {total1 += i;Thread.Sleep(10);});watch1.Stop(); //结束计时Console.WriteLine(string.Format("  Parallel.For 循环花了 {0} 毫秒。",watch1.ElapsedMilliseconds));//计算 for() 的时间int total2 = 0;Stopwatch watch2 = new Stopwatch();watch2.Start(); //开始计时for(int j=1;j< 20000; j++){total2 += j;Thread.Sleep(10);}watch2.Stop(); //结束计时Console.WriteLine(string.Format("  for 循环花了 {0} 毫秒。", watch2.ElapsedMilliseconds));}

         编译后运行结果如下:

         此时 Parallel.For() 的优势便体现出来了。继续将循环次数由 20000 改成 200,结果如下:

         使用 Parallel.For() 会快4倍左右。如果再进一步调整休眠时间为 1 毫秒,运行结果如下:

        从上面的演示可以看到,Parallel.For() 开启多线程比 for 快的前提是循环体中的代码执行要有一定的时间开销,否则是达不到更快的效果的。

 

 

 

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

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

相关文章

C#笔记8 线程是什么?多线程怎么实现和操作?

这和前面的学习内容可能有点不太连贯&#xff0c;但是呢我们一般来说的学习就是遇到什么困难就去学习什么&#xff0c;这也是为什么看那些循序渐进的教程虽然学的很饱满&#xff0c;但是我们有时会学了前面忘记了后面&#xff0c;或者对某个板块理解不深&#xff0c;乃至于写代…

大学物理实验-杨氏双缝干涉实验

一、实验目的 1.理解杨氏双缝干涉现象的基本原理&#xff1b; 2.掌握用光具座调整杨氏双缝干涉装置的光路&#xff1b; 3.用CCD观察杨氏双缝干涉的实验现象&#xff1b; 4.学会用干涉法测量未知光波的波长。 二、仪器用具 FB760-6型光学实验仪多功能光学片 三、实验原理 1.波…

智能提取:OfficeImagesExtractor让文档图片提取更简单

“科技是国之利器&#xff0c;也是民之福祉。” 在数字化办公日益普及的今天&#xff0c;我们对文档处理的需求也在不断增长。尤其是对于Office文档中的图片、视频和音频等多媒体内容的提取&#xff0c;传统的方法是繁琐且效率低下的。在这样的背景下&#xff0c;一款能够高效、…

计算机毕业设计选题推荐-产品委托配送系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

视频监控管理平台LntonAIServer视频智能分析噪声检测应用场景

在视频监控系统中&#xff0c;噪声问题常常影响到视频画面的清晰度和可用性。噪声可能由多种因素引起&#xff0c;包括但不限于低光环境、摄像机传感器灵敏度过高、编码压缩失真等。LntonAIServer通过引入噪声检测功能&#xff0c;旨在帮助用户及时发现并解决视频流中的噪声问题…

原点安全荣获“AutoSec Awards 安全之星”优秀汽车数据安全合规方案奖

9月3日&#xff0c;「AutoSec 2024第八届中国汽车网络安全周暨第五届智能汽车数据安全展」在上海盛大开幕。本届大会由谈思实验室和谈思汽车主办、上海市车联网协会联合主办&#xff0c;以汽车“网络数据安全、软件安全、功能安全”为主题&#xff0c;汇聚了国内外的技术专家、…

宏观学习笔记:GDP分析(二)

GDP分析&#xff08;一&#xff09;主要是介绍GDP相关的定义以及核算逻辑&#xff0c;本节主要介绍GDP的分析思路。GDP分析主要是2种方法&#xff1a;总量分析和结构分析。 1. 总量分析 1.1 数值选择 一般情况下&#xff0c;分析的对象都是 官方公布的GDP当季值。 1.2 趋势规…

全国-住宅区AOI数据

数据量级&#xff1a;54万&#xff0c;更新时间&#xff1a;2024年3月 覆盖字段&#xff1a; 名称&#xff0c;地址&#xff0c;经纬度&#xff0c;一级分类&#xff0c;二级分类&#xff0c;三级分类&#xff0c;默认图片&#xff0c;AOI围栏 数据来源于&#xff1a;魔行观察…

AIGC与数据分析融合,引领商业智能新变革(TOP企业实践)

AIGC与数据分析融合&#xff0c;引领商业智能新变革&#xff08;TOP企业实践&#xff09; 前言AIGC与数据分析融合 前言 在当今数字化时代&#xff0c;数据已成为企业发展的核心资产&#xff0c;而如何从海量数据中挖掘出有价值的信息&#xff0c;成为了企业面临的重要挑战。随…

开放式耳机具备什么特点?2024排行前十的四款百元蓝牙耳机推荐

开放式耳机具有以下特点&#xff1a; 佩戴舒适&#xff1a; 开放式耳机通常不需要插入耳道&#xff0c;能减少对耳道的压迫和摩擦&#xff0c;长时间佩戴也不易产生闷热、疼痛或瘙痒等不适&#xff0c;对于耳道敏感或不喜欢入耳式耳机压迫感的人来说是很好的选择。 这类耳机…

ZBrush与Blender雕刻功能哪个更好些?

选择正确的3D软件首先会让你的创作过程更加轻松&#xff0c;尤其是在动画或大片电影制作方面。不同的软件提供不同的功能&#xff0c;并倾向于专注于特定领域&#xff0c;如绘画、动画或雕刻。如果你选择了适合你风格和目标的软件&#xff0c;你可以创作出极具创意的作品。 在…

硬件工程师笔试面试——IGBT

目录 7、IGBT(绝缘栅双极晶体管) 7.1 基础 IGBT结构引脚图 IGBT实物图 7.1.1 概念 7.1.2 结构及原理 7.1.3 IGBT的安全工作区 7.1.4 IGBT分类 7.1.5 IGBT优缺点 7.2 相关问题 7.2.1 如何提高IGBT的开关速度和效率? 7.2.2 IGBT在太阳能光伏系统中的作用是什么,它如…

Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制

文章目录 Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制1. 前言2. 项目环境搭建3. 项目路由机制3.1. 1&#xff09;先搜索pom.xml文件&#xff0c;看看使用了什么框架3.2. 2&#xff09;确定是否是spring的路由机制3.3. 3&#xff09;确定自写路由机制的…

golang学习笔记05——golang协程池,怎么实现协程池?

推荐学习文档 golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学习笔记04——如何真正写好Golang代码&#xff1f; 协程池是一种用于高效处理任务的机制&…

苏茵茵:以时尚之名,诠释品质生活

在女性追求个性化与自我表达的今天&#xff0c;时尚早已超越了简单的穿着打扮&#xff0c;它成为女性展现自我风格、彰显独特魅力的重要方式。从广泛的兴趣爱好到精心雕琢的个人风格&#xff0c;每一处细节都闪耀着女性对个性独特与自我表达的深切渴望。正是这股不可阻挡的潮流…

Java 中常用内置接口函数

在 Java 8 及以后的版本中&#xff0c;引入了许多函数式编程的特性&#xff0c;其中最重要的就是内置的函数式接口。这些接口使得编写更简洁、可读性更强的代码成为可能。今天我将介绍四个常用的内置接口&#xff1a;Predicate、Function、Consumer 和 Supplier&#xff0c;并提…

ffmpeg 视频编码及基本知识

理论 H264编码原理&#xff08;简略&#xff09; 1. 视频为什么需要进行编码压缩 降低视频数据大小&#xff0c;方便存储和传输 2. 为什么压缩的原始数据采用YUV格式 彩色图像的格式是 RGB 的&#xff0c;但RGB 三个颜色是有相关性的。 采用YUV格式&#xff0c;利用人对图像的…

【C语言必学知识点七】什么?还有人不知道什么是柔性数组?还不速来!!!

动态内存管理——详细解读柔性数组 导读一、什么是柔性数组二、柔性数组的特点三、柔性数组的使用四、柔性数组的优势结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在上一篇内容中我们介绍了C/C程序中的内存分区&#xff0c;在C/C…

C++11 --- 可变参数模板

序言 不知道大家有没有细细研究过在 C 语言 中的 printf 函数&#xff0c;也许我们经常使用他&#xff0c;但是我们可能并不是那么了解他。先看一下调用格式&#xff1a;int printf ( const char * format, ... );&#xff0c;在这里的 format 代表我们的输出格式&#xff0c;后…

欧拉下搭建第三方软件仓库—docker

1.创建新的文件内容 切换目录到etc底下的yum.repos.d目录&#xff0c;创建docker-ce.repo文件 [rootlocalhost yum.repos.d]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vim docker-ce.repo 编辑文件,使用阿里源镜像源&#xff0c;镜像源在编辑中需要单独复制 h…