首页 > 其他分享 >使用 Parallel 类进行多线程编码(下)

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

时间:2024-09-09 22:55:30浏览次数:13  
标签:编码 string Parallel UserInfo Stopwatch new 多线程 public

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个不同线程来执行的。

标签:编码,string,Parallel,UserInfo,Stopwatch,new,多线程,public
From: https://blog.csdn.net/huaqianzkh/article/details/142070628

相关文章

  • [NLP] One-Hot编码
    1OneHot编码1.1定义One-Hot编码,又称独热编码。从方法性质上讲,它是一种向量表示方法,属于自然语言处理领域中的词袋模型。独热编码方法使用N位状态寄存器对N个状态进行编码,每个状态都有独立的寄存位;并且在任意时候,N为状态寄存器中都仅有一位有效状态,该位的状态值则表征了......
  • Numba最近邻插值(CPU+ GPU + Z轴切块 + XYZ轴切块 + 多线程)
    文章目录最近邻插值(加速方法)(1)scipy.ndimage.zoom(2)Numba-CPU加速(3)Numba-GPU加速(4)Numba-CPU加速(Z轴切块)(5)Numba-CPU加速(XYZ轴切块)(6)Numba-CPU加速(XYZ轴切块)+多线程输入数据插值倍数时耗scipy.ndimage.zoom(1024,1024,512)4172.16sNumba-CPU(1024,1024,512)456.58sN......
  • 二、并发编程与多线程-2.2、多线程(中)
    2.2、多线程(中)2.2.4、为什么启动线程不能直接调用run()方法?调用两次start()方法会有什么后果?答:在Java中,启动线程不能直接调用run()方法的原因是,run()方法是线程的执行体,通过调用start()方法来启动线程可以创建一个新的线程并使其运行。如果直接调用run()方法,则会在当前线......
  • 编码规范&阅《数学之美》有感
    作为计算机专业的大学生在深入学习编写代码前,我认为应当了解一些大公司内部编码规范的核心要素,遵守这些编码规范不仅有助于提高代码质量,而且也是专业发展的必要条件。通过这些规范,可以更好地帮助自己打牢基础,养成良好的编程习惯,同时也为日后进入职场做准备,以适应不同公司的编程文......
  • Vue2 和 Vue3 的区别(设计理念、性能提升、编码方式以及特性)
    Vue2和Vue3是Vue.js框架的两个主要版本,虽然它们具有许多相似之处,但也有一些重要的区别。下面是Vue2和Vue3之间的一些区别:设计理念:Vue2采用的是基于对象的设计理念,通过使用OptionsAPI来组织组件的相关选项(data、methods、computed、watch等)。Vue3采用的是基于函数的设计理念......
  • 程序员一定会感兴趣的5个关于编码助手话题
    ......
  • C++ 多线程代码性能分析——Oracle Developer Studio工具教程
        最近写项目的时候,为了提升性能,把原来一些单线程的代码改成了并行运行。这里我用到的用于评估性能提升效果的工具是OracleDeveloperStudio,不过刚上手时,发现网上相关的教程和博客较少,有些功能的使用也是摸索着过来的,这一过程可谓是十分痛苦了……如今距离初次接触......
  • STM32 TIM编码器接口测速(最详细的编码器接口笔记)
    编码器接口简单介绍方波的频率其实就代表了速度编码器接口测速原理TIM编码器测速本质上就是测频法,在指定时间内,对高电平信号进行计次编码器接口的设计逻辑就是,首先把A相和B项的所有边沿作为计数器的计数时钟,出现边沿信号的时候,就自增或者自减,如何判断自增还是自减?当出现......
  • 多线程篇(阻塞队列- DelayQueue)(持续更新迭代)
    目录一、简介二、基本原理四、代码示例简单定时调度任务多消费者定时调度任务得出结论四、应用场景一、简介DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到......
  • 多线程篇(阻塞队列- PriorityBlockingQueue)(持续更新迭代)
    目录一、简介二、类图三、源码解析1.字段讲解2.构造方法3.入队方法put浮调整比较器方法的实现入队图解4.出队方法takedequeue下沉调整比较器方法的实现出队图解四、总结一、简介PriorityBlockingQueue队列是JDK1.5的时候出来的一个阻塞队列。但是该队......