前言:

  这段时间开始用.netcore做公司项目,发现前辈搭的框架通篇运用了异步编程方式,也就是async/await方式,作为一个刚接触的小白,自然不太明白其中原理,最重要的是,这个玩意如果不明白基本原理,随意乱用反而可能会降低性能。所以下定决心准备探索学习下这玩意。我始终相信,只要肯专研,没有什么学不会的东西。

正文:

1.什么是异步:

  简单来说,正常程序执行是从上到下逐语句执行,这就叫同步,也就是说在我们没接触异步之前,我们写的代码都是同步的。那什么是异步呢?说这个之前,咱们先来考虑一种情况,比如当你写同步程序的时候,你的代码中需要先后执行两个非常耗时间的操作,暂且把这两个操作取名了A 和 B,按照同步的方式,那就必须先执行A 等A执行完(假如耗费时间10秒)然后再执行B(假如耗时15秒),这样总共就耗时25秒。这个时候就有人梦想假如A和B能够同时执行,那么只需要耗时15秒就能够执行完,所以就诞生了异步!没错,这就是异步,所以说人要有梦想,因为梦想说不定就会实现的!

2.用简单程序来探索异步基本原理:

  1.新建一个.net core 控制台项目(我这里版本是.netCore2.2,跟版本关系不大),代码和运行结果如图:

 分析下:

  1.主程序从上到下执行,先打印了 “主程序开始”,然后遇到了异步方法TestAsync(),此时进入异步方法(注意 这个时候还是同步的),所以打印了 “异步方法开始”。

  2.接着往下走,遇到await,此时表示需要开一个线程去执行await后面的内容,然后主线程立马跳出了该方法继续往下执行,所以打印出了“主线程结束”

  3.此时 开辟的异步线程在sleep 1000毫秒后往下执行 打印出 “异步线程执行”,然后再往下执行这个异步方法剩余的 打印出“异步方法结束”

我相信大家都能看懂,并从以上代码和结果能够了解了异步的基本原理。

  2.接下来我把代码修改一下,把那个异步方法改成有返回值的,代码和运行结果如下图

  仔细阅读上面代码,然后你会发现,打印的结果出乎意料,给人的第一感觉就是:这不是跟同步执行一样的结果吗,这异步有何用?没错,这就是我故意写的例子,从这种例子大家容易发现,异步用的不好等于没用,甚至会降低性能,因为框架遇到async await它会给你生成一些底层异步代码。

  但是,从上面这个例子,告诉了我们,要怎么运用好异步,这才是重点。仔细分析上面这个代码,你会发现主程序调用了异步方法之后,下一句代码就是输出这个异步的结果,问题就在此,编译器运行到这里发现需要输出这个异步结果,但是异步线程还在运行着,所以编译器就停在这里等待,直到异步方法运行结束拿到结果,才继续往下执行。

  这就相当于脱裤子放屁,这个例子运用了异步等于没用,这就告诉我们什么情况下运用异步:

  我的理解是这样的:当你要执行几个耗时操作的时候,你用异步去分别执行这几个操作,这是没问题的,但是你要注意,不要在执行异步操作的下一句代码立马去用它的结果,否则就会造成等待完成,失去异步效果。

.NetCore 异步编程 - async/await的更多相关文章

  1. 温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法

    什么是异步编程(Async/Await) Async/Await本质上是通过编译器实现的语法糖,它让我们能够轻松的写出简洁.易懂.易维护的异步代码. Async/Await是C# 5引入的关键字,用以 ...

  2. 异步编程Async/await关键字

    异步编程Async \await 关键字在各编程语言中的发展(出现)纪实. 时间 语言版本 2012.08.15 C#5.0(VS2012) 2015.09.13 Python 3.5 2016.03 ...

  3. 抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext

    长话短说,本文带大家抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext 引言 C#异步编程语法糖async/await,使开发者很容易就能编写异步代码. ...

  4. javascript异步编程 Async/await

    Async/await Async/await 在学习他之前应当补充一定的 promise 知识 它是一种与 promise 相配合的特殊语法,目前被认为是异步编程的终级解决方案 值得我们每一个人学习 ...

  5. [C#] 谈谈异步编程async await

    为什么需要异步,异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源的访问有时很慢或会延迟. 如果此类活动在同步过程中受阻,则整个应用程序必须等待. 在异步过程中, ...

  6. .net 异步编程async & await关键字的思考

    C# 5.0引入了两个关键字 async和await,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且TPL中的task与async和await有很大的关系 思考了一下异步编程中的asy ...

  7. 异步编程async/await

    什么是异步? 在异步程序中,程序代码不需要按照编写时的顺序严格执行,有时需要一在一个新的线程中运行一部分代码,有时无需创建新的 线程,但是为了更好的利用单个线程的能力,需要改变代码的执行顺序. 进程 ...

  8. c#异步编程async await

    可以代替协程了 但是需要.net4 版本 unity2017以上版本可以用了 再也可以不用蛋疼的没有返回值的协程了 //异步编程,和Task一起用 async void TestAsync(){ // ...

  9. .net 温故知新:【5】异步编程 async await

    1.异步编程 异步编程是一项关键技术,可以直接处理多个核心上的阻塞 I/O 和并发操作. 通过 C#.Visual Basic 和 F# 中易于使用的语言级异步编程模型,.NET 可为应用和服务提供使 ...

随机推荐

  1. LAMP环境之编译安装httpd服务

    “Apache HTTP Server”是开源软件项目的杰出代表,它基于标准的 HTTP 网络协议提供网页浏览服务. 在配置 Apache 网站服务之前,需要正确安装好 httpd 服务器软件.htt ...

  2. 微信小程序常用样式

    1.设置全局字体样式app.wxss: text{ font-family:MicroSoft yahei; } 2.设置弹性盒子模型: .container{ /*弹性模型*/ display:fl ...

  3. Mybatis如何执行Select语句,你真的知道吗?

    持续原创输出,点击上方蓝字关注我吧 作者:不才陈某 博客:https://chenjiabing666.github.io 前言 本篇文章是Myabtis源码分析的第三篇,前两篇分别介绍了Mybati ...

  4. pip更新命令

    python -m pip install --upgrade pip 更新时如果报错'NoneType' object has no attribute 'bytes', 解决办法:easy_ins ...

  5. 使用 usbmon 抓取 usb 总线上的数据

    使用 usbmon 抓取 usb 总线上的数据 usbmon 即 usb monitor,是 linux 内置的 usb 抓包工具.usbmon 本质是一个内核模块,在我的 ubuntu14.0 4中 ...

  6. Docker部署ElasticSearch以及使用

    ElasticSearch笔记 1. ElasticSearch前期 1.1 聊聊ElasticSearch的简介 ​ Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引 ...

  7. flask-session、数据库连接池

    flask-session 作用:将默认保存的签名cookie中的值保存到redis/memcached/file/Mongodb/SQLAlchemy 安装:pip3 install flask-s ...

  8. vue 项目中实时请求接口 建立长连接

    需求:在项目中需要每隔五秒请求一次接口 第一种方法:直接在mounted钩子函数中处理 mounted() { window.setInterval(() => { setTimeout(thi ...

  9. Java锁?分布式锁?乐观锁?行锁?

    转载自:公众号来源:码农翻身 作者:刘欣 Tomcat的锁 Tomcat是这个系统的核心组成部分, 每当有用户请求过来,Tomcat就会从线程池里找个线程来处理,有的执行登录,有的查看购物车,有的下订 ...

  10. awk的一些认识

    awk awk '{pattern + action}' {filenames} 当我们所指定的规则脚本过长的时候,我们可以使用-f的选项加上我们的脚本文件.再复杂点我们可以直接调用shell脚本,就 ...