c# 異步編程(async + await + HttpClient)

前沿

WPF應用中,有時需要從網絡獲取數據,由於網絡原因這個過程會耗時很久。爲了防止UI界面不卡死,需要進行異步編程。c#中HttpClient可以很好的進行異步網絡請求。但是其中存在一個問題,HttpClient的請求都是異步的,應該如何進行同步調用呢?

知識準備

  • C# 中的 Async 和 Await 關鍵字是異步編程的核心。使用 async 和 await 定義的異步方法簡稱爲“異步 (Async) 方法”。
  • async 和 await 關鍵字不會創建其他線程。
  • 異步方法不等同於多線程。
  • 按照約定,異步方法的名稱以“Async”後綴結尾。
  • 異步方法返回類型:
    • 如果你的方法有操作數爲 TResult 類型的返回語句,則爲 Task<TResult>
    • 如果你的方法沒有返回語句或具有沒有操作數的返回語句,則爲 Task。
  • await 可以將當前方法掛起,執行線程切換到異步方法的調用方。

示例代碼

class Program
    {
        static void Main(string[] args)
        {
            Method1();
            Method2();
            Method3();
            Console.ReadKey();
        }



        private async static Task MethodAsync()
        {
            Console.WriteLine("enter MethodAsync");
            await Task.Run(()=> {
                Thread.Sleep(3000);
            });
            Console.WriteLine("quit MethodAsync");
        }

        static void Method1()
        {
            Console.WriteLine("Method1");
        }


        static async void Method2()
        {
            Console.WriteLine("enter Method2");
            await MethodAsync();
            Console.WriteLine("quit Method2");
        }

        private static void Method3()
        {
            Console.WriteLine("Method3");
        }
    }

執行結果:

本示例展示了異步方法的調用和以同步的方式調用異步方法(聽起來有點怪,既然要以同步方法調用異步方法,爲何不直接調用同步方法代替使用異步方法)。

  • 定義一個MethodAsync異步方法。
  • Method2()依賴於MethodAsync的返回,必須等MethodAsync執行完畢才能返回Method2()。
  • 在Method2()使用await強制表示了Method2()依賴於MethodAsync的返回。
  • 需要說明的是,只有在異步方法中才能使用await同步調用另一個異步方法。

HttpClient的同步調用

將上例中的MethodAsync()當成HttpClient的異步請求方法即可。

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