前言:

  这段时间开始用.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. 关于input框仿百度/google自动提示的方法

    引入jquery-autocomplete文件 链接:https://pan.baidu.com/s/1hW0XBYH8ZgJgMSY1Ce6Pig 密码:tv5b $(function() { $( ...

  2. IDEA下Git分支开发

    IDEA下Git分支开发使用 1.新建本地开发分支 VCS-->git-->branches-->New Branch,输入分支名字,如branch_test,点击OK后本地开发分支 ...

  3. jmeter连数据库

    前提:jmeter不能直接连数据库,需要导入一个jar包 步骤: 1.右键线程组--添加--配置元件--JDBC Connection Configuration 2.jdbc的基本配置:可以修改jd ...

  4. git远程仓库创建及代码提交

    git仓库创建:1. mkdir project-repertory2. cd project-repertory3. git init --bare 此时,git仓库已成功创建. 本地要提交的代码在 ...

  5. Kubernetes中的存储(六)

    一.ConfigMap 1,介绍 ConfigMap 功能在 Kuberbetes 1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.ConfigMap API 给我们 ...

  6. 图灵机器人api的使用方法含微信版本和网页版

    访问图灵机器人官网http://www.tuling123.com/ 注册一个新的机器人账号 注册成功后转到主页 点击我的机器人>创建机器人>微信机器人 填写基本信息 点击微信介入> ...

  7. hystrix(8) 插件

    上一节讲到HystrixCommand的执行流程. Hystrix内部将一些模块实现成了插件,并且提供了用户提供自己的实现,通过配置来替换插件.Hystrix提供了5个插件,分别为并发相关插件(Hys ...

  8. 一文搞懂Cookie,Session,Token,JWT

    HTTP协议是无状态的,无状态意味着,服务器无法给不同的客户端响应不同的信息.这样一些交互业务就无法支撑了.Cookie应运而生. Cookie 通过F12开发者工具,先瞅瞅Cookie的颜值 从图中 ...

  9. ServletContex对象学习

    问题: 不同的用户使用相同的数据 解决: ServletContext对象 特点: 服务器创建 用户共享 作用域: 整个项目内 生命周期: 服务器启动到服务器关闭 使用: 1.获取SercvletCo ...

  10. linux 上部署 YApi 可视化接口管理平台

    linux 上部署 YApi 可视化接口管理平台: YApi 是一个高效.易用.功能强大的可视化接口管理平台,官方地址 : http://yapi.demo.qunar.com/ 环境要求 nodej ...