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

news2024/12/22 14:24:27

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.coloradmin.cn/o/2119790.html

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

相关文章

【第26章】Spring Cloud之Sentinel适配API Gateway

文章目录 前言一、准备1. 引入库2. 注册过滤器3. 添加配置4. 效果展示 二、基于网关的流控1. 新增流控规则2. 测试准备3. 测试结果 总结 前言 Sentinel从1.6.0 版本开始&#xff0c;Sentinel 提供了 Spring Cloud Gateway 的适配模块&#xff0c;可以提供两种资源维度的限流&a…

基于IndexDB+md-editor-v3实现的简单的文章书写小系统

基于IndexDBmd-editor-v3实现的简单的文章书写小系统 文章说明核心代码效果展示源码下载 文章说明 采用vue3 IndexDB 实现的个人仓库系统&#xff0c;采用markdown书写文章&#xff0c;并将文章信息存储在IndexDB数据库中&#xff0c;通过JavaScript原生自带的分词API进行文章…

盘点10款顶级加密软件,让企业数据安全得到保障!

随着数字化进程的加快&#xff0c;企业数据的安全性面临着越来越多的威胁。无论是内部的数据泄露还是外部的网络攻击&#xff0c;企业必须采用强大的加密软件来确保敏感信息的安全。2024年&#xff0c;企业数据安全需求日益增长&#xff0c;各类加密软件应运而生&#xff0c;提…

收银系统源码-收银台(exe、apk安装包)自由灵活操作简单!

收银系统现在已经成为门店经营必备工具&#xff0c;尤其是连锁多门店。一套好的收银系统可以帮助门店管理门店、管理商品、管理会员等&#xff0c;可以更好的经营决策。线下收银端更是门店每天高频使用的。但线下收银端需要具备哪些亮点才能更加高效呢&#xff1f; 1.收银端支…

CPP/C语言中的位运算

背景: leetcode 汉明距离问题看题解时&#xff0c;遇见了这个问题这里简单总结一下。 实例: 异或运算符 ^ 会将左右两边的数据转化为二进制形式&#xff0c;按位与 4\^1100\^0011015或运算 | 同样将左右两边数据转化为二进制形式&#xff0c;按位或 4|1100|0011015与运算…

数据结构之红黑树的 “奥秘“

目录&#xff1a; 一.红黑树概念 二. 红黑树的性质 三.红黑树的实现 四.红黑树验证 五.AVL树和红黑树的比较 一.红黑树概念 1.红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何 一条从根…

03 Flask-添加配置信息

回顾之前学习的内容 02 Flask-快速上手 Flask 中最简单的web应用组成 1. 导入核心库 Flask from flask import Flask2. 实例化 web应用 注意&#xff1a;不要漏了 app Flask(__name__) 中的 __name__ 表示&#xff1a;是从当前的py文件实例化 app Flask(__name__)3. 创…

内网隧道:端口转发

目录 LCX端口转发 场景一 场景二 SSH的端口转发 一、本地转发&#xff08;正向访问A&#xff09;&#xff1a; 二、远程转发&#xff08;反向访问A&#xff09; 三.NETSH端口转发 端口转发和端口映射 端口转发,有时被称为做隧道,是安全壳( SSH)为网络安全通信使用的一种方…

视频监控接入平台web客户端有时无法登录,有时打开实时视频出现黑屏的问题解决

目录 一、背景说明 二、解决过程 1、问题产生 2、命令介绍 ①基本用法 ②常用选项 ③示例 3、问题解决 三、最终结果 一、背景说明 在本地登录视频监控平台的服务器进行测试时&#xff0c;发现客户端登录不上。 检查服务器的服务和数据库&#xff0c;运行状况正常&#xff0c…

45个图源二维码分享及使用方法

我们曾在《40个图源二维码分享及使用方法》一文中&#xff0c;为你分享了40个图源二维码。 现在在此基础之上新增5个图源二维码&#xff0c;共分享45个。 如果你需要这些图源&#xff0c;请在文末查看领取方式。 45个图源 打开下面的网址进入水经微图&#xff08;简称“微图…

Swift 创建扩展(Extension)

类别(Category) 和 扩展(Extension) 的 用法很多. 常用的 扩展(Extension) 有分离代码和封装模块的功能,例如登陆页面有注册功能,有登陆功能,有找回密码功能,都写在一个页面就太冗余了,可以考虑使用 扩展(Extension) 登陆页面的方法来分离代码 本文介绍Swift 如何创建扩展(Ex…

maven项目下使用Jacoco测试覆盖率

【本文前提是了解maven项目及其Pom.xml机制&#xff0c;不熟悉可以看该博客的0.Pre部分Auto-Unit-Test-Case-Generator -- java项目自动测试生成-CSDN博客】 JaCoCo&#xff08;Java Code Coverage&#xff09;是一个开源的代码覆盖率工具&#xff0c;专门用于测量 Java 应用程…

Web测试中如何简单定位Bug

定位bug之前要确定自己对用例的理解是否有问题。&#xff08;在工作中,很多测试结果错误都是因为自己对用例的理解没有到位&#xff0c;以致于操作错误导致结果不符合预期&#xff09; 一般来说bug分为前端bug和后端bug&#xff0c;前端bug为请求数据错误&#xff0c;后端bug为…

web基础之信息泄露

1、目录遍历漏洞 &#xff08;1&#xff09;原理&#xff1a;本质是没有过滤用户输入的 ../ 相关的目录跳转符&#xff0c;使得攻击者通过目录跳转符来遍历服务器中的任意文件。 &#xff08;2&#xff09;题解&#xff1a; eg:根据提示遍历网页目录信息&#xff0c;会在某一个…

vscode---snippets配置全局代码片段,快捷开发!

代码片段的作用&#xff1a;在开发一个项目时&#xff0c;经常会遇到好多同一个代码逻辑&#xff0c;可配置固顶逻辑的代码块&#xff0c;避免重复敲同一代码&#xff1b; 举例&#xff1a;比如跳转登录&#xff0c;需要调用app的客户端方法&#xff0c;api调用跳转&#xff1…

Web 原生组件化方案:Web Components

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 Web 组件化是一种将Web应用的UI部分拆分成可复用的独立组件的架构方法。这种方法有助于提高代码的可维护性、可重用性和可测试性。 而Web Components 标准则提供了一套原生的API&#xff0c;允许开发者创建…

TestCraft - GPT支持的测试想法生成器和自动化测试生成器

在当今快速变化的软件开发世界中&#xff0c;自动化测试已成为确保软件质量的关键环节。而随着AI技术的进步&#xff0c;越来越多的工具开始引入人工智能&#xff0c;来辅助生成测试用例和自动化测试脚本。其中&#xff0c;TestCraft&#xff0c;作为一款GPT支持的测试想法生成…

天命所归,SyntaxFlow助大圣取得真经

之前预告许久的SyntaxFlow功能已经登陆Yakit&#xff01; SyntaxFlow代码查询需要先进行项目编译。 手动编译 在前端的YakRunner界面&#xff0c;主界面或选项栏可以直接点击“编译项目”功能。 可见图中红色方框圈起的选项 编译项目的选项如下&#xff1a;必选项为项目名、…

工控机防病毒/防勒索病毒如何一步搞定?

随着勒索病毒的肆虐和内部运营泄密事件的频发&#xff0c;企业数据安全正面临着前所未有的挑战。苏州深信达网络科技有限公司&#xff0c;作为数据安全解决方案的先驱&#xff0c;推出了MCK主机加固解决方案&#xff0c;为企业数据安全提供了一道坚不可摧的防线。 MCK主机加固…

Linux:多路转接 select、poll、epoll

目录 1&#xff1a;select 1. 参数解释 2. 函数返回值 3. fd_set 4. fd_set 相关接口 5. timeval 5. 常见使用 6. 理解 select 执行过程 7. select 的特点 8. select 缺点 9. select 应用 2&#xff1a;socket 就绪条件 1. 读事件就绪&#xff08;Readable&#x…