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功能),而这时前台不能 ...
随机推荐
- DeepSeek太火,但老板们别慌,这里有份AI项目开展手册
关注公众号回复1 获取一线.总监.高管<管理秘籍> 这两天有老板陆续在咨询:到底应该如何基于DeepSeek开展AI项目? 抛开一些偏细节.偏敏感的付费内容,其实有一套方法论倒是可以分享. ...
- 小程序开发实战案例五 | 小程序如何嵌入H5页面
在接入小程序过程中会遇到需要将 H5 页面集成到小程序中情况,今天我们就来聊一聊怎么把 H5 页面塞到小程序中. 本篇文章将会从下面这几个方面来介绍: 小程序承载页面的前期准备 小程序如何承载 H5 ...
- Salt key 系统的接口
官方文档:https://docs.saltstack.com/en/3000/ref/wheel/all/salt.wheel.key.html Wheel 系统包装了Salt key 系统,以编程 ...
- vue中的find()函数的用法与扩展用法
find函数基本格式:let obj=this.list.find(item=>item.code===val)首先在这里我们要知道的两个基础知识一.find是一个查找函数.二.箭头函数find ...
- Thymeleaf Split
<th:block th:each="image : ${#strings.listSplit(goods.images, ';')}"> <img th:src ...
- php的token管理类(AI生成)
当然,以下是一个简单的 PHP 类,用于生成和管理令牌(token).这个类可以生成一个随机的令牌.验证令牌是否有效,并允许设置一个令牌的过期时间. <?php class Token { pr ...
- pycharm clone GitHub 提示 OpenSSL SSL_read: Connection was reset, errno 10054
配置界面 错误提示 原因分析 clone的时候需要安全认证,当你在配置页面勾选上ssh ,就会报错 解决方案 在cmd里输入命令,然后再clone git config --global http.s ...
- Vue2框架-基础
1. vue简介 什么是vue? Vue是一套用于构建用户界面的渐进式JavaScript框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,方便与第三方 ...
- Visio绘制时间轴安排图的方法
本文介绍基于Visio软件绘制时间轴.日程安排图.时间进度图等的方法. 在很多学习.工作场合中,我们往往需要绘制如下所示的一些带有具体时间进度的日程安排.工作流程.项目进展等可视化图表. ...
- kubeadm init 或 join 失败 [kubelet-check] Initial timeout of 40s passed.
前言 kubeadm 初始化或 join 时,报错: [etcd] Creating static Pod manifest for local etcd in "/etc/kubernet ...