C# 提供了Task來實現異步操作,Task.Run可以很方便的啟動一個線程執行異步任務
異步操作能提高效率,但是不便於控制,假如我們要獲得異步任務的執行結果,如果采用回調的方式,傳值就比較麻煩
當然也可以直接調用Task.Result以同步的方式等待異步任務執行完畢后獲得結果再行處理,但是這樣就會導致當前線程被阻塞,浪費性能,讓人很不爽
而async/await就能避免這個問題,當我們在一個函數中使用await的時候,代碼執行到這里就會停下來等待異步函數執行完畢,但是此時當前線程卻不是阻塞的,因為await本質上是一個可輪詢狀態機,等異步任務執行完畢后,就會調用線程(應該是新的線程吧)執行之前暫停的代碼,從感官上來說能以同步的形式來處理異步函數,從性能上來說,避免了當前線程的阻塞一定程度上提高了性能
僅個人理解,不知道有沒有錯誤的地方,如有望指出,共同進步
static void Test() { Console.WriteLine("Test start..."); AAA(); //同步執行,阻塞線程 BBB(); //這里為了終止async/await的傳染,沒有等待,所以直接過去,不是異步等待 Console.WriteLine("Test end"); } static void AAA() { var task = Task.Run(() => { Console.WriteLine("task執行"); Thread.Sleep(3000); return 123; }); task.Wait(); //同步等待,會阻塞線程,直到異步函數執行完畢 //task.Result; //獲取返回值的方式 Console.WriteLine("task執行等待完成"); } /// <summary> /// 非async修飾的函數可以直接調用BBB,整體上是個異步函數 /// 如果外部還是需要等待,就不能void,需要至少返回Task,調用的時候繼續await /// </summary> static async void BBB() { var task = Task.Run(() => { Console.WriteLine("task執行"); Thread.Sleep(3000); return 123; }); int result = await task; //異步等待,await本質上是一個可輪詢狀態機,不會阻塞線程 //等task異步函數執行完畢后會再切到這里繼續執行代碼 Console.WriteLine("task執行等待完成,result=" + result); }