C# 线程(四)——异步
参考:
.NET进阶篇06-async异步、thread多线程3 - 知乎 (zhihu.com)
C# Async/Await: 让你的程序变身时间管理大师_哔哩哔哩_bilibili
Demo:
https://files.cnblogs.com/files/summerZoo/Async_Sync_Parall.zip?t=1647483780
https://files.cnblogs.com/files/summerZoo/AsyncAwait.zip?t=1647483856
异步——一个cpu在执行某个线程,遇到等待(比如I/O场景,等待数据库返回数据),它可以去执行其他任务,若当前等待结束,再由它或其他cpu执行核心去继续执行
理解:妈妈现在需要做饭,她将饭洗好放到电饭锅,按下煮饭键。然后她就去炒菜了,而不用等着米饭煮好了再去炒菜(同步),这就是异步。
异步不一定能提高单项工作的效率(米饭还是要煮半个小时、炒菜还是需要花费10分钟),但是可以提升应用程序的处理效率(在一定时间范围内做更多工作)。比如妈妈是一台服务器,半小时内她就处理了煮饭、炒菜两项请求。
应用场景:IO密集型(1、跟第三方交互的(非托管资源,经常有async版本)2.数据库openAsync-Redis交互 3.Web请求-Api 4.文件读取)
并发——创建多个线程,同一时间他们都能竞争cpu执行的时间片。
理解:现在需要做饭,需要切菜(线程一)、生火(线程二)、煮饭(线程三)这三个前期准备工作可以同时进行,为了提升效率,妈妈让儿子、丈夫、自己三个人(多个cpu执行核心)去做这三件事。这就是并发执行。但是计算器。
应用场景:CPU计算密集型(计算耗时操作)

常用异步操作:异步IO




现在,让我们假定要实现一个Wb应用程序,每个客户端请求抵达服务器时,都需要发出一个数据库请求。一个客户端请求抵达时一个线程池线程会调用你的代码。如果现在以同步方式发出一个数据库请求,线程会阻塞不确定的时间,等待数据库返回一个结果。在此期间,如果另一个客户端请求抵达,线程池会创建另一个线程,这个线程在发出另一个数据库请求后,同样会阻塞。随着越来越多的客户端请求抵达,创建的线程也越来越多,所有这些线程都阻塞并等待数据库的响应。结果是Wb服务器分配大量根本不会使用的系统资源(线程及其内存)!更糟的是,数据库真的会用各种结果来响应这些请求。线程被解锁,全都开始执行。但是,由于可能运行了大量线程,同时CPU内核只有区区几个,所以Windows被迫执行频繁的上下文切换,这进一步损害了性能。这和实现一个可伸缩应用程序的初衷是完全背道而驰的。
异步IO

Task异步
async/await
1、在采用 await AyncMethod调用异步方法AyncMethod时,主线程释放返回线程池,线程池拿到一个空闲的可执行的线程执行AyncMethod内的内容,这个空闲的线程有可能是主线程.
2、在await AyncMethod执行完成后,线程池拿到一个空闲的可执行的线程B执行AyncMethod后的内容
AyncMethod是一个耗时比较短的操作,B线程大概率会是执行AyncMethod的线程,这和clr的就近优化调度有关;
比如服务员会在客人点餐完成后上茶水,服务员A(线程1)给了顾客甲一个菜单让顾客点菜(模拟一个异步操作),然后准备去忙其他事情(释放当前线程),没想到没走两步,顾客甲说点好了(耗时短的操作),那么很大可能还是服务员A给顾客上茶水,这样最高效。
AyncMethod是一个耗时比较长的操作,B线程大概率会是线程池随机的一个空闲线程;
同样是点菜的例子,如果服务员把菜单给顾客甲之后,顾客甲说等朋友到了再点菜(耗时长的操作),半小时后朋友才来点好。这个时候肯定是老板随机让当前空闲的一个服务员去上茶水
C# 线程(四)——异步的更多相关文章
- C#中的线程四(System.Threading.Thread)
C#中的线程四(System.Threading.Thread) 1.最简单的多线程调用 System.Threading.Thread类构造方法接受一个ThreadStart委托,改委托不带参数,无 ...
- 线程池 异步I/O线程 <第三篇>
在学习异步之前先来说说异步的好处,例如对于不需要CPU参数的输入输出操作,可以将实际的处理步骤分为以下三步: 启动处理: 实际的处理,此时不需要CPU参数: 任务完成后的处理: 以上步骤如果仅仅使用一 ...
- 转载 线程池 异步I/O线程 <第三篇>
在学习异步之前先来说说异步的好处,例如对于不需要CPU参数的输入输出操作,可以将实际的处理步骤分为以下三步: 启动处理: 实际的处理,此时不需要CPU参数: 任务完成后的处理: 以上步骤如果仅仅使用一 ...
- 【转载】Javascript里面的线程和异步
JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序. 参考这篇文章 http://www.ruanyifeng.com/blog/2012/1 ...
- BeginInvoke 方法真的是新开一个线程进行异步调用吗?
转自原文BeginInvoke 方法真的是新开一个线程进行异步调用吗? BeginInvoke 方法真的是新开一个线程进行异步调用吗? 参考以下代码: public delegate void tre ...
- python线程实现异步任务
了解异步编程 楼主在工作中遇到了以下问题,开发接口爬取数据代码完成之后要写入redis缓存,但是在写入缓存的过程花费2-3s,进行这样就大大影响了接口的性能,于是想到了使用异步存储. 传统的同步编程是 ...
- java future模式 所线程实现异步调用(转载
java future模式 所线程实现异步调用(转载) 在多线程交互的中2,经常有一个线程需要得到另个一线程的计算结果,我们常用的是Future异步模式来加以解决.Future顾名思意,有点像期货市场 ...
- Android线程之异步消息处理机制(三)——AsyncTask
Android的异步消息处理机制能够很完美的解决了在子线程中进行UI操作的问题,但是为了更加方便我们在子线程中对UI进行操作,Android还提供了另一个很好用的工具,AsyncTask就是其中之一. ...
- Android线程之异步消息处理机制(二)——Message、Handler、MessageQueue和Looper
异步消息处理机制解析 Android中的异步消息处理主要有四个部分组成,Message.Handler.MessageQueue和Looper. 1.Message Message是在线程之间传递的消 ...
- Java ExecutorServic线程池(异步)
相信大家都在项目中遇到过这样的情况,前台需要快速的显示,后台还需要做一个很大的逻辑.比如:前台点击数据导入按钮,按钮后的服务端执行逻辑A,和逻辑B(执行大量的表数据之间的copy功能),而这时前台不能 ...
随机推荐
- Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]
Count Arrays:一眼秒的计数题. 思路 显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是 \(1\),就会形成一个基环树森林. 那么考虑这个环上能填什么数.因为所有数都小于等于 ...
- HT-018 Div3 构造 题解 [ 黄 ] [ 数学 ] [ 结论 ]
构造:结论题,gcy数竞大佬tql%%%orz. 结论 先放结论:如果 \(x \bmod 4=2\) ,那么 \(x\) 无法被表示为 \(a^2-b^2\) 的形式:除此之外的其他数都可以. 证明 ...
- Linux驱动---LED
目录 一.pinctrl子系统 二.GPIO子系统 三.GPIO操作步骤 3.1.获取GPIO描述符 3.2.设置方向 3.3.读写值 四.编写LED驱动 4.1.硬件原理图 4.2.修改设备树 4. ...
- [BZOJ3622] 已经没有什么好害怕的了 题解
发现难以维护差值,于是令 \(K=\frac{n+k}2\),这样就把问题转化为了"糖果"比"药片"大的组数为 \(K\) 的情况有多少种. 设 \(dp_{i ...
- 库卡机器人KR120示教器日常保养技巧
库卡机器人KR120是一款高效.精准的工业机器人,广泛应用于各个领域.然而,要确保其长期稳定运行,日常的保养和维护至关重要.下面,我们将为您介绍库卡机器人KR120示教器的日常保养 ...
- ABC391D题解
前置知识: map priority_queue 思路 考虑预处理每一个图块在第几秒后会被删除. 如何预处理?我使用了一种非常暴力的做法,首先处理的过程肯定是从下往上的,于是每一个图块能被删除一定是它 ...
- ZLMediaKit: 快速入门
目录 ZLMediaKit是什么 编译 安装依赖库 构建项目 问题处理 问题1: srtp 未找到, WebRTC 相关功能打开失败 问题2:依赖库问题 安装 配置和运行 问题处理 问题1: 无权限监 ...
- php如何处理表单和数据库字段不匹配
// 假设从表单接收到的数据 $formData = [ 'first_name' => $_POST['first_name'], 'last_name' => $_POST['last ...
- css3 渐变边框如何实现圆角效果
常规的 border-image 属性如果直接使用 border-radius 会无效,关于如何实现渐变边框圆角,网上流传着大概这么几种办法: 渐变背景方式(仅适用于纯底色背景) 借助 after 伪 ...
- canvas 获取图片中某个坐标的颜色
同步发布:https://blog.jijian.link/2020-04-05/canvas-get-color/ 由于功能受限,此处不能放 iframe 嵌入链接,如需看到实时效果,请移步 htt ...