在C#編程語言中,async
和await
是兩個關(guān)鍵字,它們共同用于簡化異步編程。異步編程是一種編程模式,它允許程序在等待某些操作(通常是I/O操作,如網(wǎng)絡(luò)請求或磁盤讀寫)完成時,不會阻塞當前的執(zhí)行線程,從而提高應(yīng)用程序的響應(yīng)性和性能。
定義
async:async
關(guān)鍵字用于定義一個方法,表示該方法內(nèi)部包含異步操作,即該方法可能在執(zhí)行過程中不會立即完成,而是會在某個點等待一個異步操作完成。被async
修飾的方法通常會返回一個Task
或Task<TResult>
對象,表示一個正在進行的操作。
await:await
關(guān)鍵字只能在被async
修飾的方法內(nèi)部使用。它用于等待一個異步操作完成,而不會阻塞當前線程。await
后面通常跟著一個返回Task
或Task<TResult>
的異步方法調(diào)用。當await
表達式執(zhí)行時,它會暫停當前方法的執(zhí)行,直到所等待的異步操作完成,然后繼續(xù)執(zhí)行方法中的后續(xù)代碼。
使用
下面是一個簡單的示例,展示了如何在C#中使用async
和await
關(guān)鍵字:
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args) // Main方法也可以使用async和await(從C# 7.1開始)
{
string data = await FetchDataFromWebAsync("https://example.com");
Console.WriteLine(data);
}
static async Task<string> FetchDataFromWebAsync(string url)
{
using (HttpClient client = new HttpClient())
{
// 使用await等待異步網(wǎng)絡(luò)請求完成
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
return responseBody;
}
}
}
在這個示例中,FetchDataFromWebAsync
方法被標記為async
,因為它內(nèi)部執(zhí)行了異步的網(wǎng)絡(luò)請求。await client.GetAsync(url)
和await response.Content.ReadAsStringAsync()
這兩行代碼都使用了await
關(guān)鍵字來等待異步操作完成。
Main
方法也被標記為async
,并且它使用了await
來等待FetchDataFromWebAsync
方法的執(zhí)行結(jié)果。由于Main
方法是程序的入口點,并且從C# 7.1開始,Main
方法也被允許是異步的,這極大地簡化了異步代碼的編寫。
使用async
和await
的好處是它們提供了一種直觀的方式來編寫異步代碼,而不需要顯式地處理回調(diào)方法或復(fù)雜的線程同步問題。編譯器會自動生成必要的狀態(tài)機代碼來管理異步操作的執(zhí)行流程。
注意:盡管async
和await
使得異步代碼看起來像同步代碼,但程序的執(zhí)行仍然是異步的。這意味著在等待異步操作完成時,不會阻塞調(diào)用線程,從而提高了應(yīng)用程序的響應(yīng)性。
該文章在 2024/1/31 16:27:36 編輯過