Middle
Ako funguje mechanizmus async/await v C#?
sobes.tech AI
Odpoveď od AI
Mechanizmus async/await umožňuje písanie asynchrónneho kódu, ktorý vyzerá ako synchronný.
- Kľúčové slovo
async: Označuje metódu ako asynchrónnu. Takáto metóda môže obsahovať inštrukciuawait. - Kľúčové slovo
await: Používa sa pred volaním asynchrónnej operácie (zvyčajne metódy, ktorá vraciaTaskaleboTask<T>). Keď sa vykonávanie dostane kawait, kontrola sa vráti volajúcej metóde a uvoľnené vlákno môže vykonávať inú prácu. Task/Task<T>: Predstavuje sľub dokončenia asynchrónnej operácie a jej výsledku (preTask<T>).await"čaká" na dokončenie tohto "sľubu".- Stavový stroj: Kompilátor premení asynchrónnu metódu na stavový stroj. Tento stroj uchováva stav metódy pri dosiahnutí
await. - Pokračovanie: Keď očakávaná úloha skončí, prostredie na vykonávanie naplánuje vykonanie zvyšnej časti asynchrónnej metódy (pokračovanie) na vlákne z poolu alebo v rovnakom synchronizačnom kontexte, ak je zachytený.
- Vrátenie kontroly: Po dokončení asynchrónnej operácie sa kontrola vráti na miesto po
await, a vykonávanie metódy pokračuje so zachovaným stavom.
// Asynchrónna metóda
async Task<int> GetLengthAsync(string url)
{
// Vytvorenie HTTP klienta
using var client = new HttpClient();
// Vykonanie asynchrónneho dopytu na URL
// Await čaká na dokončenie dopytu bez blokovania vlákna
string content = await client.GetStringAsync(url);
// Pokračovanie sa vykoná po získaní obsahu
return content.Length;
}
// Použitie asynchrónnej metódy
async void Button_Click(object sender, EventArgs e)
{
// Await čaká na ukončenie GetLengthAsync
// UI vlákno nie je blokované
int length = await GetLengthAsync("https://example.com");
// Aktualizácia UI prvku
Label1.Text = $"Dĺžka obsahu: {length}";
}