C# ansyc/await/Task用法

C# ansyc/await/Task用法

注:Task要在.Net 4.5 環境下有效,似乎是因爲:

從 C# 7 開始,返回另一個類型(通常爲值類型),該類型具有 GetAwaiter 方法,可儘可能減少性能關鍵代碼段中的內存分配。

測試代碼1

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            YBCL();
            MessageBox.Show($"看看什麼時候執行!");
        }

        private async void YBCL()
        {
            //await ybTest();
            Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(10000); MessageBox.Show($"任務進行中!"); });
            MessageBox.Show($"任務已完成!");
        }

        public Task ybTest()
        {
            Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(1000); });
            return t1;
        }

彈窗的先後順序爲
這裏寫圖片描述
這裏寫圖片描述
已完成->進行中->(點擊“已完成”確定後)看看什麼時候執行

也就是說,Task相當於開了一個線程,而後直接執行下一步的操作,點擊完成後,又返回到最初的ButtonBase_OnClick函數去執行“看看什麼時候執行”函數。線程結束後,自動彈出“任務進行中”。

測試代碼1

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            YBCL();
            MessageBox.Show($"看看什麼時候執行!");
        }

        //此處用await關鍵字
        private async void YBCL()
        {
            await ybTest();           
            MessageBox.Show($"任務已完成!");
        }

        public Task ybTest()
        {
            Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(1000);MessageBox.Show($"任務進行中!");});
            return t1;
        }

彈窗的先後順序爲
這裏寫圖片描述
這裏寫圖片描述
看看什麼時候執行->進行中->(點擊“進行中”確定後)已完成

也就是說,事件觸發後,調用了異步函數YBCL(),然後不等這個函數響應,直接跳過了整個函數。而在YBCL()中,await的作用是等待ybTest()函數運算完,纔開始運算下面的函數。即:await下面的函數,需要等待await 的對象 完成後 才能繼續運行。
而async函數外部的代碼,則是與函數內部的代碼分開了。

發佈了71 篇原創文章 · 獲贊 39 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章