新項(xiàng)目組用到Async & Await, 關(guān)于Await會(huì)不會(huì)新開不開線程,遇到什么情況會(huì)新開線程的問題網(wǎng)上查了很多資料都沒看到直觀的解釋?,F(xiàn)簡單總結(jié)一下。
直接上代碼:
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在新線程中執(zhí)行,并告訴Main線程繼續(xù)往下執(zhí)行。 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); } }}
結(jié)果如下
Current Thread Id1 :9
Current Thread Id3 :10
Current Thread Id2 :10
為了驗(yàn)證await是不是遇到新開啟線程的方法才會(huì)觸發(fā)他的作用,做如下更改。
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); } }}
發(fā)現(xiàn)Main線程會(huì)等待GetName里的復(fù)雜運(yùn)算結(jié)束后,知道Task.Delay才會(huì)繼續(xù)執(zhí)行Main線程,猜測正確。
補(bǔ)充一句,在第一段code中,如果在Test方法中的 await Task.Run(new Action(GetName)); 沒有await, 代碼跑到這里開啟線程的同時(shí)Main線程會(huì)繼續(xù)往下之前,因此await是包含了本行及以下的所有代碼在新線程中執(zhí)行,但僅限本方法及本方法調(diào)用的方法,不會(huì)進(jìn)入上級(jí)方法。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注