.NetCore异步asyncawait探索
⾛进.NetCore的异步编程 - 探索 async/await
前⾔:
这段时间开始⽤core做公司项⽬,发现前辈搭的框架通篇运⽤了异步编程⽅式,也就是async/await⽅式,作为⼀个刚接触的⼩⽩,⾃然不太明⽩其中原理,最重要的是,这个玩意如果不明⽩基本原理,随意乱⽤反⽽可能会降低性能。所以下定决⼼准备探索学习下这玩意。我始终相信,只要肯专研,没有什么学不会的东西。
有兴趣爱好⼀起学习交流netcore相关技术的加:275080612.另外本⼈博客:欢迎来交流!
正⽂:
1.什么是异步:
简单来说,正常程序执⾏是从上到下逐语句执⾏,这就叫同步,也就是说在我们没接触异步之前,我们写的代码都是同步的。那什么是异步呢?说这个之前,咱们先来考虑⼀种情况,⽐如当你写同步程序的时候,你的代码中需要先后执⾏两个⾮常耗时间的操作,暂且把这两个操作取名了A 和 B,按照同步的
⽅式,那就必须先执⾏A 等A执⾏完(假如耗费时间10秒)然后再执⾏B(假如耗时15秒),这样总共就耗时25秒。这个时候就有⼈梦想假如A和B能够同时执⾏,那么只需要耗时15秒就能够执⾏完,所以就诞⽣了异步!没错,这就是异步,所以说⼈要有梦想,因为梦想说不定就会实现的!
await和async使用方法2.⽤简单程序来探索异步基本原理:
1.新建⼀个 core 控制台项⽬(我这⾥版本是Core
2.2,跟版本关系不⼤),代码和运⾏结果如图:
分析下:
1.主程序从上到下执⾏,先打印了 “主程序开始”,然后遇到了异步⽅法TestAsync(),此时进⼊异步⽅法(注意这个时候还是同步的),所以打印了 “异步⽅法开始”。
2.接着往下⾛,遇到await,此时表⽰需要开⼀个线程去执⾏await后⾯的内容,然后主线程⽴马跳出了该⽅法继续往下执⾏,所以打印出了“主线程结束”
3.此时开辟的异步线程在sleep 1000毫秒后往下执⾏打印出 “异步线程执⾏”,然后再往下执⾏这个异步⽅法剩余的打印出“异步⽅法结束”
我相信⼤家都能看懂,并从以上代码和结果能够了解了异步的基本原理。
2.接下来我把代码修改⼀下,把那个异步⽅法改成有返回值的,代码和运⾏结果如下图
仔细阅读上⾯代码,然后你会发现,打印的结果出乎意料,给⼈的第⼀感觉就是:这不是跟同步执⾏⼀样的结果吗,这异步有何⽤?没错,这就是我故意写的例⼦,从这种例⼦⼤家容易发现,异步⽤的不好等于没⽤,甚⾄会降低性能,因为框架遇到async await它会给你⽣成⼀些底层异步代码。
但是,从上⾯这个例⼦,告诉了我们,要怎么运⽤好异步,这才是重点。仔细分析上⾯这个代码,你会发现主程序调⽤了异步⽅法之后,下⼀句代码就是输出这个异步的结果,问题就在此,编译器运⾏到这⾥发现需要输出这个异步结果,但是异步线程还在运⾏着,所以编译器就停在这⾥等待,直到异步⽅法运⾏结束拿到结果,才继续往下执⾏。
这就相当于脱裤⼦放屁,这个例⼦运⽤了异步等于没⽤,这就告诉我们什么情况下运⽤异步:
我的理解是这样的:当你要执⾏⼏个耗时操作的时候,你⽤异步去分别执⾏这⼏个操作,这是没问题的,但是你要注意,不要在执⾏异步操作的下⼀句代码⽴马去⽤它的结果,否则就会造成等待完成,失去异步效果。
最后:
先写到这吧,感谢⼤家阅读,觉得有⽤就点个赞哈。由于本⼈不太习惯在博客园上写⽂章,平常⼀般在⾥跟⼤家交流,欢迎⼤家加⼊.NetCore交流:275080612
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论