前沿
WPF應用中,有時需要從網絡獲取數據,由於網絡原因這個過程會耗時很久。爲了防止UI界面不卡死,需要進行異步編程。c#中HttpClient可以很好的進行異步網絡請求。但是其中存在一個問題,HttpClient的請求都是異步的,應該如何進行同步調用呢?
知識準備
- C# 中的 Async 和 Await 關鍵字是異步編程的核心。使用 async 和 await 定義的異步方法簡稱爲“異步 (Async) 方法”。
- async 和 await 關鍵字不會創建其他線程。
- 異步方法不等同於多線程。
- 按照約定,異步方法的名稱以“Async”後綴結尾。
- 異步方法返回類型:
- 如果你的方法有操作數爲 TResult 類型的返回語句,則爲
Task<TResult>
。 - 如果你的方法沒有返回語句或具有沒有操作數的返回語句,則爲 Task。
- 如果你的方法有操作數爲 TResult 類型的返回語句,則爲
- 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的異步請求方法即可。