新項目組用到Async & Await, 關于Await會不會新開不開線程,遇到什么情況會新開線程的問題網上查了很多資料都沒看到直觀的解釋。現簡單總結一下。
直接上代碼:
namespace Consoleapplication2{ class PRogram { static void Main(string[] args) { Test(); Console.WriteLine("Current Thread Id1 :{0}", Thread.CurrentThread.ManagedThreadId); Console.ReadKey(); } static async Task Test() { await Task.Run(new Action(GetName)); //Await 在這里必須搭配Task的新開線程方法使用,并且表示從這一行開始的剩余code在新線程中執行,并告訴Main線程繼續往下執行。 Console.WriteLine("Current Thread Id2 :{0}", Thread.CurrentThread.ManagedThreadId); } public static void GetName() { for(int i=0; i<1000000000;i++) { int a = 15*15*15*15*15*15; } Console.WriteLine("Current Thread Id3 :{0}", Thread.CurrentThread.ManagedThreadId); } }}
結果如下
Current Thread Id1 :9
Current Thread Id3 :10
Current Thread Id2 :10
為了驗證await是不是遇到新開啟線程的方法才會觸發他的作用,做如下更改。
namespace ConsoleApplication2{ class Program { static void Main(string[] args) { Test(); Console.WriteLine("Current Thread Id1 :{0}", Thread.CurrentThread.ManagedThreadId); Console.ReadKey(); } static async Task Test() { await GetName(); Console.WriteLine("Current Thread Id2 :{0}", Thread.CurrentThread.ManagedThreadId); } public static async Task GetName() { for(int i=0; i<1000000000;i++) { int a = 15*15*15*15*15*15; } await Task.Delay(10000); Console.WriteLine("Current Thread Id3 :{0}", Thread.CurrentThread.ManagedThreadId); } }}
發現Main線程會等待GetName里的復雜運算結束后,知道Task.Delay才會繼續執行Main線程,猜測正確。
補充一句,在第一段code中,如果在Test方法中的 await Task.Run(new Action(GetName)); 沒有await, 代碼跑到這里開啟線程的同時Main線程會繼續往下之前,因此await是包含了本行及以下的所有代碼在新線程中執行,但僅限本方法及本方法調用的方法,不會進入上級方法。
新聞熱點
疑難解答