走进. NetCore 的异步编程 - 探索 async/await
前言:
这段时间开始用. 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 它会给你生成一些底层异步代码.
但是, 从上面这个例子, 告诉了我们, 要怎么运用好异步, 这才是重点. 仔细分析上面这个代码, 你会发现主程序调用了异步方法之后, 下一句代码就是输出这个异步的结果, 问题就在此, 编译器运行到这里发现需要输出这个异步结果, 但是异步线程还在运行着, 所以编译器就停在这里等待, 直到异步方法运行结束拿到结果, 才继续往下执行.
这就相当于脱裤子放屁, 这个例子运用了异步等于没用, 这就告诉我们什么情况下运用异步:
我的理解是这样的: 当你要执行几个耗时操作的时候, 你用异步去分别执行这几个操作, 这是没问题的, 但是你要注意, 不要在执行异步操作的下一句代码立马去用它的结果, 否则就会造成等待完成, 失去异步效果.
最后:
来源: http://www.bubuko.com/infodetail-2973148.html