1. 程式人生 > 其它 >.net 關於Task.Run 和 Async await的執行順序

.net 關於Task.Run 和 Async await的執行順序

一直捋不清楚用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關鍵字後面內容,是在回撥中完成。

 

 

最後回顧一下,寫的基本和其他人一樣難懂,但自己是捋清楚了,也不虧,哈哈。