前言:

  这段时间开始用.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. Kubernetes 服务部署最佳实践(二) ——如何提高服务可用性

    引言 上一篇文章我们围绕如何合理利用资源的主题做了一些最佳实践的分享,这一次我们就如何提高服务可用性的主题来展开探讨. 怎样提高我们部署服务的可用性呢?K8S 设计本身就考虑到了各种故障的可能性,并提 ...

  2. UBer面向领域的微服务体系架构实践

    介绍 最近,人们对面向服务的系统架构和微服务系统架构的缺点进行了大量的讨论.尽管仅仅在几年前,由于微服务体系架构提供了许多好处,如独立部署的灵活性.明确的所有权.提高系统稳定性以及更好地分离关注点等, ...

  3. oracle之二数据字典表和动态性能视图

    数据字典表和动态性能视图 Oracle提供了大量的内部表,它们记录了数据库对象的更改和修正.可以将这些内部表划分为两种主要类型:静态的数据字典表和动态的性能表.这些内部表是由oracle维护的,可以说 ...

  4. SDL开发笔记(二):音频基础介绍、使用SDL播放音频

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  5. 分别用canvas和css3的transform做出钟表的效果

    两种方式实际上在js上的原理都是一样的.都是获取时间对象,再获取时间对象的时分秒,时分秒乘以其旋转一刻度(一秒.一分.一小时)对应的角度.css3中要赋值于transform:rotate(角度),c ...

  6. Docker实战(5)升级Docker版本后的报错

    出现情况:因我升级了Centos内核后docker服务无法开启,所做重装处理但还是无效,最终将docker服务做了升级,升级步骤我会放置下面,但在启动老版本容器又出现Error response fr ...

  7. 一个提高N倍系统新能的编程点,却总是被普通开发们遗忘

    位运算这个概念并不陌生,大多数程序员在进入这个领域的时候或多或少都接触过位运算,估计当时都写过不少练习题的. 位运算本身不难,困难的是大家没有学会在系统设计时用上它,提高系统性能,增加你的不可替代性. ...

  8. Powershell编程基础-002-日期及日期格式化

    在Powershell中,关于日期,时间计算与格式化,常用的如下: $today=Get-Date                                                    ...

  9. Spring学习(八)AOP详解

    文章更新时间:2020/04/06 一.一个例子 在上面的例子中,包租婆的核心业务就是签合同,收房租,那么这就够了,灰色框起来的部分都是重复且边缘的事,交给中介商就好了,这就是 AOP 的一个思想:让 ...

  10. java进阶(19)--异常处理机制

    一.基本概念 1.异常的作用: java将异常信息打印至控制台,供程序修改,增加其健壮性. int c=1/0;    //将抛出 java.lang.ArithmeticException 2.异常 ...