走進.NetCore的異步編程 - 探索 async/await
前言:
這段時間開始用.netcore做公司項目,發現前輩搭的框架通篇運用了異步編程方式,也就是async/await方式,作為一個剛接觸的小白,自然不太明白其中原理,最重要的是,這個玩意如果不明白基本原理,隨意亂用反而可能會降低性能。所以下定決心准備探索學習下這玩意。我始終相信,只要肯專研,沒有什么學不會的東西。
有興趣愛好一起學習交流netcore相關技術的加群:275080612.另外本人博客:小彪博客 歡迎來交流!
正文:
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交流群:275080612