要理解async和await的用法,首先要瞭解Task相關知識,這裡不做說明,因為這不是本文的重點。 如果你已經對Task很瞭解,那麼如何使用async和await,在此主要總結了以下三點: 對於第三點說的有點繞,所以下麵結合代碼說一下: 執行結果: 對結果解釋是: Main方法調用具有
要理解async和await的用法,首先要瞭解Task相關知識,這裡不做說明,因為這不是本文的重點。
如果你已經對Task很瞭解,那麼如何使用async和await,在此主要總結了以下三點:
- 只有在async方法裡面才能使用await操作符;
- await操作符是針對Task對象的;
- 當方法A調用方法B,方法B方法體內又通過await調用方法C時,如果方法C內部有非同步操作,則方法B會等待非同步操作執行完,才往下執行;但方法A可以繼續往下執行,不用再等待B方法執行完。
對於第三點說的有點繞,所以下麵結合代碼說一下:
static void Main(string[] args) { Test(); Console.WriteLine("Test End!"); Console.ReadLine(); } static async void Test() { await Test1(); Console.WriteLine("Test1 End!"); } static Task Test1() { Thread.Sleep(1000); Console.WriteLine("create task in test1"); return Task.Run(() => { Thread.Sleep(3000); Console.WriteLine("Test1"); }); }
執行結果:
對結果解釋是:
Main方法調用具有async標示的Test方法,Test方法通過await調用Test1方法,當執行順序執行到Test1時,遇到裡面的非同步操作;則Test方法會等待Test1裡面的非同步操作執行完再往下執行;但是Main方法,不用再等待Test方法執行,可以繼續往下執行。
對於上面情況,可以不使用async和await也能實現,代碼如下:
static void Main(string[] args) { Test(); Console.WriteLine("Test End!"); Console.ReadLine(); } static void Test() { var test1=Test1(); Task.Run(() => { test1.Wait(); Console.WriteLine("Test1 End!"); }); } static Task Test1() { Thread.Sleep(1000); Console.WriteLine("create task in test1"); return Task.Run(() => { Thread.Sleep(3000); Console.WriteLine("Test1"); }); }
最後:這是我個人的理解和總結,歡迎大家來討論或指教