Sobes.tech
Junior

Kas yra asinchroninis programavimas naudojant raktinius žodžius async ir await?

sobes.tech AI

Atsakymas iš AI

Asinchroninis programavimas su async ir await leidžia vykdyti operacijas, kurios gali užtrukti ilgai (pavyzdžiui, įvesties-išvesties, tinklo užklausos), neblokiruojant pagrindinio vykdymo srauto. Tai pagerina programėlės reagavimą.

  • async: Naudojamas metodo modifikatoriui ir nurodo kompiliatoriui, kad jame bus naudojami await operatoriai. Metodas, pažymėtas kaip async, gali grąžinti Task, Task<T> arba void (nors void reikėtų vengti, išskyrus įvykių tvarkytojus). Grąžintas Task arba Task<T> atstovauja operaciją, kuri dar nėra baigta.
  • await: Taikomas asinchroninei operacijai (grąžinančiai Task arba Task<T>). Kai vykdymas pasiekia await, metodas "laikinai sustoja" ir atlaisvina dabartinį srautą. Asinchroninė operacija vykdoma foniniame režime (arba naudoja srautų pool'ą, arba operacinės sistemos įvesties-išvesties mechanizmą). Kai operacija baigiasi, vykdymas atnaujinamas po to paties await arba tame pačiame sraute, jei jis yra prieinamas.

Pagrindinis pavyzdys:

// async metodas, grąžinantis Task
public async Task DoSomethingAsync()
{
    // Vykdome asinchroninę operaciją ir laukiame jos pabaigos
    await Task.Delay(1000); // Ilgo veiksmo imitacija
    Console.WriteLine("Async operacija baigta.");
}

// async metodas, grąžinantis Task<int>
public async Task<int> GetValueAsync()
{
    await Task.Delay(500);
    return 42;
}

// Async ir await naudojimas Main metode (pavyzdžiui, dažniausiai paleidžiama iš async Main .NET Core 3.0+)
public static async Task Main(string[] args)
{
    Console.WriteLine("Pradedama...");
    
    // Kviečiame asinchronines funkcijas
    await DoSomethingAsync();
    int result = await GetValueAsync();
    
    Console.WriteLine($"Rezultatas: {result}");
    Console.WriteLine("Baigta.");
}

Pagrindinis async/await pranašumas – palengvina asinchroninio kodo rašymą ir skaitymą, nes jis atrodo kaip sinchroninis, bet neblokuoja srauto, kas yra itin svarbu programėlėse su vartotojo sąsaja ar serverinėse programose su dideliu apkrovimu.