C# .Net学习笔记—— 异步和多线程(Async和Sync)

一、概念

进程:一个程序运行时,占用的全部计算资源的总和
线程:1、程序执行流的最小单位;任何操作都是由线程完成的
           2、线程是依托于进程存在的,一个进程可以包含多个线程;
           3、线程也可以有自己的计算资源
多线程:多个执行流同时运行
            1、CPU太快了,分时间片-一上下文切换(加载环境--计算-一保存环境)
微观角度,一个核同一时刻只能执行一个线程;宏观的来说是多线程并发
             2、多CPU多核可以独立工作
                   4核8线程一核是物理的核线程是指虚拟核

同步:完成计算之后,再进入下一行
异步:不会等待方法的完成,会直接进入下一行非阻塞

C#异步和多线程有什么差别
多线程就是多个thread并发;
异步是硬件式的异步
异步多线程-thread pool task

二、同步异步简单案例

 private void buttonSync_Click(object sender, EventArgs e){Log.Info($"S Start {Thread.CurrentThread.ManagedThreadId}");int j = 3;int k = 5;int m = j + k;for (int i = 0; i < 5; i++){string name = string.Format($"**********S{i}*************");this.DoSomethingLong(name);}Log.Info($"S End");}private void buttonAsync_Click(object sender, EventArgs e){Log.Info($"\nA Start {Thread.CurrentThread.ManagedThreadId}");Action<string> action = this.DoSomethingLong;for (int i = 0; i < 5; i++){string name = string.Format($"**********A{i}*************");action.BeginInvoke(name, null, null);}Log.Info($"A End");}private void DoSomethingLong(string name){Log.Info($"DoSomethingLong Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {name} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");long result = 0;for (int i = 0; i < 100000000; i++){result += i;}Thread.Sleep(2000);Log.Info($"DoSomethingLong End {Thread.CurrentThread.ManagedThreadId.ToString("00")} {name} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");}

 同步:

 异步:

 

从打印结果来看也能反映出,

同步:1、完成计算之后,再进入下一行。

           2、同步方法卡界面,主(UI)线程忙于计算。

           3、同步方法慢,只有一个线程干活
异步:1、不会等待方法的完成,会直接进入下一行非阻塞。

           2、异步多线程方法不卡界面,主线程完事,计算任务交给子线程在做。

           3、异步多线程方法快,因为多个线程并发运算

           4、异步并不是线性增长,而是资源换时间,多线程也有管理成本

           5、提升用户体验

           6、并不是越多越好

           7、最好是多个独立任务同时进行的使用

异步等待方式1:异步回调:

        private void buttonAysncCallback_Click(object sender, EventArgs e){Log.Info($"DoSomethingLong Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");Action<string> action = this.DoSomethingLong;AsyncCallback callback = ia => Log.Info($"计算完成。{Thread.CurrentThread.ManagedThreadId.ToString("00")}  {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");action.BeginInvoke("AysncCallBack", callback, null);Log.Info($"DoSomethingLong End {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");}

从结果来看,异步回调action.BeginInvoke()可以得到一个AsyncCallBack,然后这个callBack再执行的委托。这样可以有效的控制我们线程的次序。

缺点:我想要全部计算都完成了再给用户返回结果,这种方法实现不了

异步等待方式2:线程等待

asyncResult.AsyncWaitHandle.WaitOne(); //等待任务完成
asyncResult.AsyncWaitHandle.WaitOne(); //等待任务完成
asyncResult.AsyncWaitHandle.WaitOne(1000); //等待;但是最多等待1000ns

  异步等待方式3: EndInvoke()

        private void buttonTest_Click(object sender, EventArgs e){Func<int> func = () =>{Thread.Sleep(2000);return DateTime.Now.Day;};Console.WriteLine($"func.Invoke()={func.Invoke()}");IAsyncResult asyncResult = func.BeginInvoke(r =>{Console.WriteLine(r.AsyncState);}, "哈啊哈哈");Console.WriteLine($"func.EndInvoke(asyncResult) = {func.EndInvoke(asyncResult)}");}

 

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

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

相关文章

基于web的电影院购票系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1选题动因 当前…

跟着仙凡兄学习 ros2 ubuntu与windows的安装(本人小白开始,一步一步跟着坑走,最后都成功的)

目 录 1 ROS安装的步骤 2 1.1 ROS UBUNTU安装 2 1.1.1 环境配置&#xff1a;UBUNTU20.04 2 1.1.2 设置编码 2 1.1.3 添加ROS2 APT仓库 3 1.1.4 接下来可以安装ROS2了 3 1.1.5 创建 COLCON 工作区并下载教程 3 1.1.6 设置环境 4 1.1.7 双环境设置 4 1.1.8 验证之一 5 1.2 ROS2 W…

x-cmd pkg | trafilatura - 网络爬虫和搜索引擎优化工具

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 trafilatura 是一个用于从网页上提取文本的命令行工具和 python 包: 提供网络爬虫、下载、抓取以及提取主要文本、元数据和评论等功能可帮助网站导航和从站点地图和提要中提取链接无需数据库&#xff0c;输出即可转换…

Linux Perf 介绍

文章目录 前言 二、安装Perf三、二级命令3.1 perf list3.2 perf record/report3.3 perf stat3.4 perf top 四、使用火焰图进行性能分析4.1 下载火焰图可视化生成器4.2 使用perf采集数据4.3 生成火焰图参考资料 前言 perf是一款Linux性能分析工具&#xff0c;内置在Linux内核的…

【SpringBoot】Java MVC 集成 Swagger 生成 API 文档

使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。官网: https://swagger.io/ Knife4j 是为Java MVC框架集成Swagger生成Api文档的增强解决方案。 <dependency><groupId>com.github.xiaoymin</groupI…

ELement UI时间控件el-date-picker误差8小时解决办法

一、问题描述&#xff1a; 在项目中引用了elementui中的date-picker组件&#xff0c;选中的时间跟实际相差八小时&#xff0c;且格式不是自己想要的格式 <el-date-pickertype"date"placeholder"选择日期"format"yyyy/M/d"v-model"form…

微信小程序封装vant 下拉框select 单选组件

先上效果图&#xff1a; 主要是用vant 小程序组件封装的&#xff1a;vant 小程序ui网址&#xff1a;vant-weapp 主要代码如下: 先封装子组件&#xff1a; select-popup 放在 components 文件夹里面 select-popup.wxml: <!--pages/select-popup/select-popup.wxml--> &…

科技智慧,产业链全覆盖:河南恩珅德农业的养殖业务优势

河南恩珅德农业以科技智慧和全产业链覆盖的优势&#xff0c;成功打造了一体化的养殖业务模式&#xff0c;为养殖者提供了全面的支持和优越的管理体验。以下是该企业养殖业务的核心优势&#xff1a; 1. 先进科技智慧 河南恩珅德农业充分利用先进的科技手段&#xff0c;引入智能…

EtherCAT的COE报文

本文主要用于记录工作中需要学习的内容&#xff0c;如有冒犯请私信&#xff01; COE协议 下面我们介绍以下CANOpen在EtherCAT中的应用。 COE的对象字典 COE协议是完全遵循CANopen协议的&#xff0c;但针对EtherCAT通信做了一些扩展&#xff0c;索引为0x1c00~0x1c4f&#xff0…

k8s---pod的生命周期

pod的相关知识 pod是k8s中最小的资源管理组件 pod也是最小化运行容器化的应用的资源管理对象 pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合。 k8s中pod的两种使用方式 &#xff08;1&#xff09;一个pod中运行一个容器。"每个po中一个容器&…

基于springboot企业物流管理系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 研究背景 互…

门店总数超9000家,手握大众茶饮“下沉市场牌”的古茗冲刺上市

奶茶品牌上市潮来袭。1月2日&#xff0c;奶茶品牌古茗控股有限公司&#xff08;下称“古茗”&#xff09;、蜜雪冰城股份有限公司&#xff08;下称“蜜雪冰城”&#xff09;一同递交招股书&#xff0c;计划在港交所主板上市。 近年来&#xff0c;随着现制茶饮的爆火&#xff0…