Sobes.tech
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ý.

  1. Kľúčové slovo async: Označuje metódu ako asynchrónnu. Takáto metóda môže obsahovať inštrukciu await.
  2. Kľúčové slovo await: Používa sa pred volaním asynchrónnej operácie (zvyčajne metódy, ktorá vracia Task alebo Task<T>). Keď sa vykonávanie dostane k await, kontrola sa vráti volajúcej metóde a uvoľnené vlákno môže vykonávať inú prácu.
  3. Task / Task<T>: Predstavuje sľub dokončenia asynchrónnej operácie a jej výsledku (pre Task<T>). await "čaká" na dokončenie tohto "sľubu".
  4. Stavový stroj: Kompilátor premení asynchrónnu metódu na stavový stroj. Tento stroj uchováva stav metódy pri dosiahnutí await.
  5. 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ý.
  6. 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}"; 
}