.net 關於Task.Run 和 Async await的執行順序
阿新 • • 發佈:2022-05-06
一直捋不清楚用Task.Run非同步的執行關係,網上找的些說明寫得也有點複雜,所以自己做實驗測一下。
直接上程式碼
這個是加await
private static void TestFun() { Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Test start!"); MainTask(); Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Test End !"); } private static async Task MainTask() { Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} MainTask Start !"); Thread.Sleep(2000); //await or not await Task.Run(() => { Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Subtask Start !"); Thread.Sleep(2000); Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Subtask End !"); }); Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} MainTask End !"); }
執行結果
這裡TestFun呼叫async非同步方法Maintask,2s後遇到await,馬上回去執行TestFun中後面的操作“Test End”,同時await裡的Subtask也開始執行,並且Subtask完成後才顯示“MainTask end”。
再去掉await
private static void TestFun() { Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Test start!"); MainTask(); Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Test End !"); } private static async Task MainTask() { Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} MainTask Start !"); Thread.Sleep(2000); //await or not Task.Run(() => { Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Subtask Start !"); Thread.Sleep(2000); Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Subtask End !"); }); Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} MainTask End !"); Thread.Sleep(1000); }
結果
這裡順序就不一樣了,進入MainTask 2s後,執行Subtask的Task,並且開始執行Subtask之後的內容,再之後才跳出MainTask顯示“End”。
為了便於理解,我在“MainTask End”下面多sleep了1s,為了區分上一個測例因為遇到await Task跳出的情況。
簡單總覺一下:
呼叫async非同步方法的執行緒,遇到await,馬上回去繼續執行後面的操作,而async非同步方法裡面,則是執行完任務,再繼續執行await關鍵字後面的內容,相當於await關鍵字後面內容,是在回撥中完成。
最後回顧一下,寫的基本和其他人一樣難懂,但自己是捋清楚了,也不虧,哈哈。