Sobes.tech
Junior

Čo je asynchrónne programovanie s použitím kľúčových slov async a await?

sobes.tech AI

Odpoveď od AI

Asynchrónne programovanie s async a await umožňuje vykonávať operácie, ktoré môžu trvať dlhú dobu (napríklad vstup a výstup, sieťové požiadavky), bez blokovania hlavného vlákna vykonávania programu. To zlepšuje odozvu aplikácie.

  • async: Používa sa na modifikáciu metódy a naznačuje prekompilátoru, že vo vnútri budú používané operátory await. Metóda označená ako async môže vracať Task, Task<T> alebo void (hoci void by sa malo vyhýbať, okrem spracovateľov udalostí). Vrátený Task alebo Task<T> predstavuje operáciu, ktorá ešte nie je dokončená.
  • await: Používa sa na asynchrónnu operáciu (vracajúcu Task alebo Task<T>). Keď vykonanie dosiahne operátor await, metóda sa "pozastaví" a uvoľní aktuálne vlákno. Asynchrónna operácia sa vykonáva na pozadí (alebo využíva pool vlákien, alebo mechanizmus vstupu-výstupu operačného systému). Keď sa operácia dokončí, vykonávanie metódy sa obnoví po tom istom await na inom vlákne alebo na tom istom vlákne, ak je dostupné.

Príklad základného použitia:

// async metóda, ktorá vracia Task
public async Task DoSomethingAsync()
{
    // Vykonávame asynchrónnu operáciu a čakáme na jej dokončenie
    await Task.Delay(1000); // Napodobnenie dlhodobej operácie
    Console.WriteLine("Async operácia dokončená.");
}

// async metóda, ktorá vracia Task<int>
public async Task<int> GetValueAsync()
{
    await Task.Delay(500);
    return 42;
}

// Použitie async a await v metóde Main (pre príklad, v reálnych aplikáciách sa zvyčajne spúšťa z async Main v .NET Core 3.0+)
public static async Task Main(string[] args)
{
    Console.WriteLine("Začiatok...");
    
    // Voláme asynchrónne metódy
    await DoSomethingAsync();
    int result = await GetValueAsync();
    
    Console.WriteLine($"Výsledok: {result}");
    Console.WriteLine("Dokončené.");
}

Hlavnou výhodou async/await v porovnaní s ručnou správou vlákien alebo kolbíkmi je zjednodušenie písania a čítania asynchrónneho kódu. Vyzerá takmer rovnako ako synchronný kód, ale pritom neblokuje vlákno, čo je kriticky dôležité pre aplikácie s používateľským rozhraním alebo serverové aplikácie s vysokou záťažou.