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

news2024/12/23 3:24:34

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

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

相关文章

erlang学习: Mnesia Erlang数据库

创建Mnesia数据库 mnesia:create_schema([node()]).在shell里输入该行代码即可创建一个mnesia数据库于当前文件夹下 编译器文件路径下同样也有 数据库表定义创建 之后是数据库表定义&#xff0c;打开数据库创建完成后&#xff0c;启动数据库&#xff0c;添加一些表定义&…

ccpc网络热身赛: Iris’Food

题目 做法 第一位选除0外最小的数&#xff0c;其他位按从小到大选。 #include<bits/stdc.h> #define int unsigned long long using namespace std; int t,a[20],m; const int mod1e97; int ksm(int a,int b){int ans1;while(b){if(b%2) ansans*a%mod;b/2;aa*a%mod;}r…

哪里打印便宜一点?什么地方打印便宜?

在这个快节奏的时代&#xff0c;无论是学生、上班族还是创业者&#xff0c;都有可能面临需要紧急打印文件的情况。然而&#xff0c;面对市面上琳琅满目的打印服务提供商&#xff0c;如何选择性价比高的打印服务成了许多人关心的问题。今天&#xff0c;我们就来探讨一下“哪里打…

SQL注入基础入门完整教学

SQL注入-概述 什么是sql注入漏洞&#xff1f; 攻击者利用Web应用程序对用户输入验证上的疏忽&#xff0c;在输入的数据中包含对某些数据 库系统有特殊意义的符号或命令&#xff0c;让攻击者有机会直接对后台数据库系统下达指令&#xff0c;进而 实现对后台数据库乃至整个应用…

如何进行不同数据库的集群操作?--从部署谈起,今天来看MySQL和NoSql数据库Redis的集群

篇幅较长&#xff0c;主要分为mysql和Redis两部分。找想要的部分可见目录食用。。 目录 什么是集群&#xff1f;为什么要集群&#xff1f; 1.1 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 1.2 为什么还要用 NoSQL 数据库呢&#xff1f; ----------------…

python怎么输入中文

解决中文输入的两种应用&#xff1a; 在脚本中加语言编码声明 “-*- coding: uft-8 -*-” 应用一&#xff1a;print中出现中文 方法一&#xff1a;用unicode( , encoding utf-8 ) 或者 unicode(" ", encoding "utf-8" )。 方法二&#xff1a;用u 或者…

springboot 的共享session方案?

问&#xff1a;springboot 的共享session方案&#xff1f; 参考&#xff1a; https://juejin.cn/post/7195227930077691963分布式之session共享问题 4种解决方案及spring session的使用_分布式session共享方案-CSDN博客 什么是 Session &#xff1f; 答&#xff1a;因为Http协…

新能源动力组中预充电路及电阻选型分析

新能源动力组中预充电路及电阻选型分析 1.概述2.预充电路与预充电阻3.预充电阻参数选择4.实例分析 1.概述 最近几年&#xff0c;新能源行业在中国得到迅猛发展。由于其高效、节能、低噪声、无污染等特点&#xff0c;它已成为国内工业发展的新趋势包括汽车和飞机。虽然应用在新…

微波无源器件2 用于双极化波束形成网络的增强型双极化定向耦合器

摘要&#xff1a; 定向耦合器和混合相移器是用于实现波束形成网络的关键器件。通常一个波束形成网络用线极化和正交极化两个极化给天线馈电。双极化器件被用于降低波束形成网络的复杂性和尺寸。双极化定向耦合器由相同的作者提出。一种增强型的双极化耦合器在本文中提出。此器件…

JumpServer关闭admin mfa验证

背景 因为上一次启动了mfa验证&#xff0c;但是没有验证就关机重启&#xff0c;导致再开机输入密码后需要mfa绑定&#xff0c;但是怎么也无法绑定成功&#xff0c;导致无法登录。 故希望通过后台取消mfa的验证 from users.models import Useru User.objects.get(usernameadmin…

ThreadLocal 释放的方式有哪些

ThreadLocal基础概念&#xff1a;IT-BLOG-CN ThreadLocal是Java中用于在同一个线程中存储和隔离变量的一种机制。通常情况下&#xff0c;我们使用ThreadLocal来存储线程独有的变量&#xff0c;并在任务完成后通过remove方法清理这些变量&#xff0c;以防止内存泄漏。然而&…

前端开发的单例设计模式

一、什么是单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的设计模式&#xff0c;它确保在整个应用程序的生命周期中&#xff0c;一个类只能创建一个实例。无论你在代码的任何地方尝试创建该类的新实例&#xff0c;它都会返回已经存在的唯一实例。这在…

鸿蒙开发(API 12 Beta6版)【NFC标签读写】 网络篇

简介 近场通信(Near Field Communication&#xff0c;NFC)是一种短距高频的无线电技术&#xff0c;在13.56MHz频率运行&#xff0c;通信距离一般在10厘米距离内。电子设备可以通过NFC通信技术和NFC标签通信&#xff0c;从标签中读取数据&#xff0c;或写入数据到标签。 NFC标…

XInput手柄输入封装

功能全面地封装了XInput的输入, 1. 普通按钮按下, 按住, 弹起状态检查, 2. 摇杆4个方向的按下, 按住, 弹起检查 3. 按键状态变化检测并且记录按下触发时间, 按住保持时间, 方便用来完全自定义的输入功能 4. 多手柄输入合并 CXinputHelper.h #pragma once #include <win…

微信支付开发避坑指南

1 微信支付的坑 1.1 不能用前端传递过来的金额 订单的商品金额要从数据库获取&#xff0c;前端只传商品 id。 1.2 交易类型trade type字段不要传错 v2版API&#xff0c;不同交易类型&#xff0c;要调用的支付方式也不同。 1.3 二次签名 下单时&#xff0c;在拿到预支付交…

哈希表-数据结构

一、哈希表基本概念 哈希表&#xff08;也称为散列表&#xff09;是根据键而直接访问在内存存储位置的数据结构&#xff0c;也就是说实际上是经过哈希函数进行映射&#xff0c;映射道表中一个位置来访问记录&#xff0c;这个存放记录的数组称为散列表。 哈希函数&#xff1a;就…

计组基础知识

操作系统的特征 并发 共享 虚拟 异步 操作系统的功能 1、资源分配&#xff0c;资源回收 硬件资源 CPU、内存、硬盘、I/O设备。 2、为应⽤程序提供服务 操作系统将硬件资源的操作封装起来&#xff0c;提供相对统⼀的接⼝&#xff08;系统调⽤&#xff09;供开发者调⽤。 3、管…

Redis 集群会有写操作丢失吗?为什么?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis 集群会有写操作丢失吗&#xff1f;为什么&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 集群会有写操作丢失吗&#xff1f;为什么&#xff1f; Redis 并不能保证数据的强一致性&#xff0c;这意味这在…

Qt_概述

目录 1、图形用户界面 2、客户端开发 3、什么是界面 4、Qt的发展史 5、Qt支持的平台 6、Qt的版本 7、Qt的优点 8、Qt的应用场景 小结 前言&#xff1a; Qt是一个应用程序开发框架&#xff0c;他具有跨平台性质&#xff0c;主要使用C语言进行编程&#xff0c;Qt的开发…

透视表支持自定义聚合公式,新增字体管理功能,DataEase开源BI工具v2.10 LTS版本发布

2024年9月9日&#xff0c;人人可用的开源BI工具DataEase正式发布v2.10 LTS&#xff08;Long Term Support&#xff09;版本。DataEase开源项目组将对v2.10 LTS版本提供长期支持&#xff0c;定期迭代发布小版本&#xff0c;持续进行问题修复更新并针对部分功能进行优化。欢迎广大…