C#掃盲篇(四):.NET Core 的異步編程-只講干貨(async,await,Task)


   關於async,await,task的用法和解釋這里就不要說明了,網上一查一大堆。至於為啥還要寫這篇文章,主要是其他文章水分太多,不適合新手學習和理解。以下內容純屬個人理解,如果有誤,請高手指正。本文只對以下這段代碼包含的異步編程寫法作說明:
using System; using System.Threading.Tasks; using System.Threading; namespace ConsoleTest { class Program { static void Main(string[] args) { Console.WriteLine(ThreadID() + " =》主線程啟動"); MethodAsync();//調用異步方法
            Console.WriteLine(ThreadID() + " =》主線程繼續執行"); Console.WriteLine(ThreadID() + " =》主線程結束 END"); Console.Read(); } static async void MethodAsync() { Console.WriteLine(ThreadID() + " =》MethodAsync方法開始執行"); string str = await DoSomething();//等待GetString執行完成 
            Console.WriteLine(ThreadID() + " =》MethodAsync方法執行結束"); } static Task<string> DoSomething() { Console.WriteLine(ThreadID() + " =》DoSomething方法開始執行"); return Task<string>.Run(() => { Thread.Sleep(4000);//導步線程 處理耗時任務 
                Console.WriteLine(ThreadID() + " =》DoSomething方法結束執行"); return "GetString的返回值"; }); } static string ThreadID() { return Thread.CurrentThread.ManagedThreadId.ToString(); } } }

 

以上代碼的執行結果如圖:

 

這個例子非常的經典,是曾經上學時老師給我們的實例,用來理解這幾個關鍵詞特別好。 

看完代碼的執行順序,以下對新手,包括自己曾經的疑問做一些簡明扼要的解釋,希望一兩句話能讓大家馬上知道,不至於被網上各種文章繞暈。

疑問一:await會阻塞當前線程,等異步線程干完活了再跑?

不會阻塞。當前線程會一直跑進異步方法里,直到遇到要新開一個線程干活時就返回繼續跑。此時,新線程在那里干活,主線程干完活就忙其他事去了。新線程干完活,回來await的地方把接下來的活繼續干了。

疑問二:async+await 和同步執行有什么好處,都是要一個線程干活,一條龍干到底不好嗎,非得自己干到一半交給另一個線程去干,別人干活不用開銷嗎?

這個問題的關鍵就是有些IO事情真的不需要CPU派一個線程去干,去了也干不了。比如讀寫文件,以往同步方法時,派一個線程去讀寫點東西的時候,這個線程肯定是等在那的,讀寫這個事情是硬盤去做的,線程就是個使者,告訴硬盤要做哪些事就行,硬盤干完活就告訴線程,線程拿着結果開心地繼續干下面的活。那異步就是線程通知硬盤去讀寫后自己就回去該干嘛干嘛去,不必等在硬盤家門口等消息。硬盤讀寫的時候,這個線程是非阻塞的,可以干其他活,提高效率。硬盤讀寫完,會通知CPU,叫他派一個線程來拿結果,(如果框架是單線程的,那還是這個線程過來)這個線程拿到結果后會繼續執行之前那個線程未干完的活,至於上下文信息,底層會交代好,不在這里討論,太深。這個IO事情有很多,比如訪問數據庫,請求網絡等。


往期精彩:

 

  首發自:【程序員不帥哥 】公眾號

  原文鏈接:https://mp.weixin.qq.com/s/P2oN-2au3x5oTbzlrC5WYg

  掃碼關注,更多精彩內容及時獲取,一起提高,一起加油


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM