前言:

  这段时间开始用.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. Python多行缩进反向缩进快捷键

    1.Python增加缩进快捷键:Ctrl+Alt+] 或tab键或shift+tab键 2.Python减少缩进快捷键:Ctrl+Alt+[ 

  2. 借助FreeHttp任意篡改Websocket报文(Websocket改包)

    前言 作为Web应用中最常见的数据传输协议之一的Websocket,在我们日常工作中也势必会经常使用到,而在调试或测试中我们常常也有直接改变Websocket数据报文以确认其对应用的影响的需求,本文将 ...

  3. appium 基础二:常用api接口

    一.获取手机分辨率 size=driver.get_window_size()#获取手机屏幕大小,分辨率 print(size)#{'width': 720, 'height': 1280} 得到的是 ...

  4. .NET Core原理(不知道怎么命名合适)

    作者:cmliu:.NET Core启动都做了什么 .NET Core默认启动时的流程,您可以将图片另存为,在本地放大查看 .NET Core默认模板都做了些什么,首先贴出模板里面的Program.c ...

  5. [翻译] 发布双屏预览SKD,公布MICROSOFT 365开发者日日期

    [前置提示]:本文翻译工作尚未完工,您可以先看原文QUQ 原文标题:Announcing dual-screen preview SDKs and Microsoft 365 Developer Da ...

  6. CentOS 7安装SeaweedFS

    1.从GitHub下载编译好的SeaweedFS 地址:https://github.com/chrislusf/seaweedfs/releases 选择linux_amd64.tar.gz的压缩包 ...

  7. JVM-垃圾回收篇

    目录 JVM-垃圾回收篇 前言 举个例子 JVM 有哪些垃圾回收算法? 标记-清除算法 复制算法 标记-整理算法 分代收集算法 JVM 有哪些垃圾回收器? 概述 几个相关概念 一:Serial 收集器 ...

  8. 软件工程与UML作业3(互评作业)

    博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE1/ 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018S ...

  9. EAM在不同行业的应用

    EAM在不同行业的应用 EAM从出现至今,已让很多资产密集型企业受益,甚至在一些行业领域里已经是公认的.不可或缺的管理方案,比如电力行业.轨道交通行业等.但由于不同行业或者企业业务类型不同,导致了资产 ...

  10. Combine 框架,从0到1 —— 4.在 Combine 中执行异步代码

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中执行异步代码. 内容概览 前言 用 Future 取代回调闭包 用输出类型( ...