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