C# 關於異步等待async/await的學習理解


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);
        }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM