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

2.Parallel.ForEach() 的使用

 从 ForEach() 这个名字可以看出该方法是用来遍历泛型集合的,新建一个 ASP.NET Core Web应用的项目,如下:

         在 Index.cshtml.cs 文件中增加一个 UserInfo.cs 的类,代码如下:

    public class UserInfo{ public int UserId { get; set; }public string UserName { get; set; }}

         在 Index.cshtml.cs 文件的 IndexModel 类中添加测试方法 ParallelForEachDemo(),代码如下:

        public void OnGet(){ParallelForEachDemo();}  public string DemoStr; //定义页面取值的变量public void ParallelForEachDemo(){//构造泛型集合数据List<UserInfo> userList = new List<UserInfo>{new UserInfo{ UserId=1,UserName="张三" },new UserInfo{ UserId=2,UserName="李四" },new UserInfo{ UserId=3,UserName="王五" },new UserInfo{ UserId=4,UserName="赵六" },new UserInfo{ UserId=5,UserName="大师兄" }};//foreach 循环时间统计string allName1 = string.Empty;Stopwatch sw1 = new Stopwatch();sw1.Start(); //计时开始foreach (UserInfo user in userList){allName1 += user.UserName + ",";Thread.Sleep(10);//模拟一个耗时操作,以免看不到效果}sw1.Stop(); //计时结束//Parallel.ForEach 循环时间统计string allName2 = string.Empty; Stopwatch sw2 = new Stopwatch();sw2.Start(); //计时开始Parallel.ForEach(userList, user => //多线程遍历{allName2 += user.UserName + ",";Thread.Sleep(10);//模拟一个耗时操作,以免看不到效果});sw2.Stop(); //计时结束//记录花费时间DemoStr = string.Format("foreach 循环花费时间为:{0},Parallel.ForEach 循环花费时间为:{1}", sw1.ElapsedMilliseconds, sw2.ElapsedMilliseconds);}

        在 Index.cshtml.cs 中输出 DemoStr 变量的值,代码如下:

<div class="text-center"><h1 class="display-4">Welcome</h1><br /><p> @Model.DemoStr </p>
</div>

         编译后运行,结果如下:

         显然使用多线程更快,单线程和多线程的时间差距大概是5倍左右(不同CPU时间不同,这里仅代表本次执行结果)。

3.Parallel.Invoke() 的使用

        在 Index.cshtml.cs 文件的 IndexModel 类中新增方法,分别访问 bing.com,360.cn,baidu.com 这3个网站, 然后统计响应的字符数,代码如下:

        /// <summary>/// Thread.CurrentThread.ManagedThreadId 用于显示当前的线程ID/// </summary>/// <param name="from"></param>/// <param name="url"></param>public void CountString(string from, string url){long cnt = 0;HttpWebRequest request = WebRequest.CreateHttp(url); //根据给定的网址创建一个请求HttpWebResponse response = (HttpWebResponse)request.GetResponse(); //得到响应对象cnt = response.ContentLength; //获取响应内容长度//用table标签格式化输出便于查看ContentStr += "<tr><td>" + from + "</td><td>" + Thread.CurrentThread.ManagedThreadId + "</td>" +"<td>" + url + "</td><td>" + cnt + "</td></tr>";return;}

        单线程顺序执行3次函数:

        /// <summary>/// 单线程执行3次函数取三个不同网址的内容/// </summary>/// <returns></returns>public string SingleTotal(){Stopwatch sw1 = new Stopwatch();sw1.Start();CountString("single", "http://www.bing.com");CountString("single", "http://www.360.cn");CountString("single", "http://www.baidu.com");sw1.Stop();return sw1.ElapsedMilliseconds.ToString();}

         多线程并发执行3次函数:

public string MultiTotal(){Stopwatch sw2 = new Stopwatch();sw2.Start(); // 使用Lambda表达式构造 Action,这里可以传多个方法来并行执行,不限于3个Parallel.Invoke(          ()=>CountString("Multi", "http://www.bing.com"), ()=>CountString("Multi", "http://www.360.cn"), ()=>CountString("Multi", "http://www.baidu.com"));sw2.Stop();return sw2.ElapsedMilliseconds.ToString();}

        在 OnGet() 函数中分别调用单线程方法和多线程方法: 

        public string DemoStr; //定义页面取值的变量来显示执行时间public string ContentStr; //定义页面取值变量来显示函数执行情况public void OnGet(){string time1 = SingleTotal(); //单线程花费时间string time2 = MultiTotal(); //多线程花费时间DemoStr = string.Format("单线程花费时间为:{0},多线程花费时间为:{1}", time1, time2);//用表格来展示数据更清晰ContentStr = "<table border='1' width='600' style='margin:0 auto;'>" +"<tr><td>类型</td><td>线程ID</td><td>网址</td><td>响应内容长度</td></tr>" + ContentStr + "</table>"; }

         在 Index.cshtml 中修改代码如下:

<div class="text-center"><h1 class="display-4">Welcome</h1><br /><p> @Model.DemoStr </p><br /><p> @Html.Raw(Model.ContentStr) </p>
</div>

        编译后运行结果如下: 

        显然,使用多线程时花费的时间更少。

        从表格的执行明细中也可以看到:使用多线程的时候3个方法分别是3个不同线程来执行的。

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

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

相关文章

组合逻辑电路的分析

目录 组合逻辑电路的分析 分析思路 基本步骤 例题1 例题2 组合逻辑电路的分析 分析思路 基本步骤 例题1 将每个门的输出命名。 写出逻辑函数式。 列真值表。 ABC全一致输出为1。 例题2 观察发现这三个结构是一样的。 逐级写出逻辑函数式&#xff1a; 发现这其实就是异或…

基于云端的跨平台个人信息管理系统

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

无线麦克风哪款好用,手机领夹麦克风哪个牌子好,麦克风推荐

随着短视频与直播行业的蓬勃发展&#xff0c;无线领夹麦克风市场迎来了前所未有的繁荣。品牌如罗德、大疆、西圣等麦克风品牌凭借卓越的技术实力与品牌影响力占据了市场的主导地位&#xff0c;其中西圣更是凭借其高性价比和用户口碑&#xff0c;稳居行业口碑品牌前列。但在这光…

Chainlit集成Langchain并使用通义千问实现文生图网页应用

前言 本文教程如何使用通义千问的大模型服务平台的接口&#xff0c;实现图片生成的网页应用&#xff0c;主要用到的技术服务有&#xff0c;chainlit 、 langchain、 flux。合利用了大模型的工具选择调用能力。实现聊天对话生成图片的网页应用。 阿里云 大模型服务平台百炼 API…

最新融合多模态的理解和生成的大一统transform架构,show-o模型部署

Show-o是由字节跳动和新加坡国立大学Show Lab共同研发的一个多模态大模型&#xff0c;统一了多模态理解和生成。 Show-o的创新之处在于它将自回归和离散扩散建模相结合&#xff0c;以适应不同和混合模态的输入和输出。 Show-o模型的架构基于预训练的大型语言模型&#xff08;…

web基础之SSRF

1、内网访问 题目提示&#xff1a;访问位于127.0.0.1的flag.php&#xff1b;直接利用ssrf漏洞访问?url127.0.0.1/flag.php 2、伪协议读取文件 &#xff08;1&#xff09;题目提示&#xff1a;尝试去读取一下Web目录下的flag.php吧 &#xff08;2&#xff09;什么是伪协议&a…

【鸿蒙】HarmonyOS NEXT星河入门到实战6-组件化开发-样式结构重用常见组件

目录 1、Swiper轮播组件 1.1 Swiper基本用法 1.2 Swiper的常见属性 1.3 Swiper的样式自定义 1.3.1 基本语法 1.3.2 案例小米有品 2、样式&结构重用 2.1 Extend:扩展组件(样式、事件) 2.2 Styles:抽取通用属性、事件 2.3 Builder:自定义构建函数(结构、样式、事…

无人机视角-道路目标检测数据集 航拍 8600张 voc yolo

数据集名称&#xff1a; 无人机视角-道路目标检测数据集 数据集规模&#xff1a; 图像数量&#xff1a;8600张拍摄方式&#xff1a;航拍&#xff08;使用无人机拍摄&#xff09;标注格式&#xff1a;支持VOC和YOLO格式 数据集内容&#xff1a; 该数据集由无人机从空中拍摄的…

Android10源码刷入Pixel2以及整合GMS

一、ASOP源码下载 具体可以参考我之前发布的文章 二、下载相关驱动包 这一步很关键,关系到编译后的镜像能否刷入后运行 下载链接:Nexus 和 Pixel 设备的驱动程序二进制文件 如下图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本: 下载解压后会有两…

5.qml 如何管理好控制台打印输出

c 在工程文件里面加入&#xff0c;这个只是禁用了c端的打印 DEFINES QT_NO_WARNING_OUTPUT DEFINES QT_NO_DEBUG_OUTPUT qml 在pro里面添加 #CONFIG - declarative_debug #CONFIG - qml_debug DEFINES QT_QML_DEBUG_NO_WARNING禁用qml打印,在main.cpp中引入 qputenv…

git为不同的项目设置不同的提交作者

方法1&#xff1a;找到项目的.git文件夹打开 打开config在下面添加自己作者信息 [user]name 作者名email 邮箱方法2&#xff1a;直接在.git文件夹设置作者名&#xff08;不使用–global参数&#xff09; git config user.name "xxxxx"如果想要修改之前提交的…

【idea-安装】

JetBrains官⽹ : https://www.jetbrains.com/ 1.下载idea安装包&#xff0c;下载旧一些的版本&#xff0c;避免新版本的不稳定。 下载下来的安装包是exe格式的&#xff0c;直接点击运行。 点击Next 2.选择要下载的位置&#xff0c;点击下一步。 3.选择⽣成快捷⽅式和建⽴⽂件…

uniapp数据缓存和发起网络请求

数据缓存 uni.onStorageSync同步的方式将数据存储到本地缓存 <template><button click"onStorageSync()">存储数据</button> </template><script setup>const onStorageSync () > {// 存储数据uni.setStorageSync(username, 张三)…

刷题活动(旋转和翻转)

前两天打了CCPC网络赛&#xff08;让打老实了&#xff09;&#xff0c;现在认识到了刷题的重要性&#xff0c;于是我开创了这么个栏目&#xff0c;我们一起刷一下题。 还是在ACwing网站上刷题 旋转和翻转 首先&#xff0c;申一下题目&#xff0c;输入一个数字 n &#xff0c;来…

【堆的应用--C语言版】

前面一节我们都已将堆的结构&#xff08;顺序存储&#xff09;已经实现&#xff0c;对树的相关概念以及知识做了一定的了解。其中我们在实现删除操作和插入操作的时候&#xff0c;我们还同时实现了建大堆&#xff08;小堆&#xff09;的向上&#xff08;下&#xff09;调整算法…

JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看

一 jvm的内存模型 2.1 jvm内存模型概览 2.2 pc计数器 它是一块很小的内存空间&#xff0c;集合可以忽略不记&#xff0c;也是运行速度最快的存储区域。不会随着程序的运行需要更大的空间。 在jvm规范中&#xff0c;每个线程都有它自己的程序计数器&#xff0c;是线程私有的&…

DIC技术助力新能源汽车主机厂力学测试研发与整车性能提升

在新能源汽车研发过程中&#xff0c;非接触式全视场应变DIC测量方案&#xff0c;越来越受到汽车主机厂的信赖与认可。传统接触式传感器&#xff0c;在精度、灵活性和数据处理能力上存在局限。DIC技术可提供精确、高效、全视场、便捷的非接触式测量解决方案。 在汽车研发阶段&a…

C语言知识体系思维导图

为了更清晰地描述C语言知识体系&#xff0c;笔者用一个结构化的思维导图来概括其主要组成部分。见下&#xff1a; 这个思维导图旨在提供一个全面而系统的视角&#xff0c;帮助学习者逐步构建扎实的C语言知识体系。随着学习的深入&#xff0c;可以根据个人兴趣和职业需求&#x…

《Diffusion Models Without Attention》CVPR2024

摘要 这篇论文探讨了在高保真图像生成领域&#xff0c;去噪扩散概率模型&#xff08;Denoising Diffusion Probabilistic Models, DDPMs&#xff09;的重要性。尽管DDPMs在捕捉复杂视觉分布方面表现出色&#xff0c;但在高分辨率图像生成上面临显著的计算挑战。现有的方法&…

计算机毕业设计 《计算机基础》网上考试系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…