Sobes.tech
Middle

Kaip veikia async/await mechanizmas C#-e?

sobes.tech AI

Atsakymas iš AI

async/await mechanizmas leidžia rašyti asinchroninį kodą, kuris atrodo kaip sinchroninis.

  1. Raktinis žodis async: pažymi metodą kaip asinchroninį. Toks metodas gali turėti await operatorių.
  2. Raktinis žodis await: naudojamas prieš iškviečiant asinchroninę operaciją (paprastai metodą, kuris grąžina Task arba Task<T>). Kai vykdymas pasiekia await, valdymas grįžta iškviečiančiam metodui, o laisvas srautas gali vykdyti kitą darbą.
  3. Task / Task<T>: atstovauja pažadą, kad asinchroninė operacija bus baigta ir jos rezultatas (jei Task<T>). await "laukia" šio "pažado" pabaigos.
  4. Būsenų mašina: kompiliatorius paverčia asinchroninį metodą galutine automatine mašina. Ši mašina išsaugo metodo būseną pasiekus await.
  5. Tęsinys: kai laukiama užduotis baigiasi, vykdymo aplinka planuoja vykdyti likusią asinchroninio metodo dalį (tęsinį) iš eilės arba toje pačioje sinchronizacijos kontekste, jei jis yra užfiksuotas.
  6. Valdymo grąžinimas: po asinchroninės operacijos pabaigos valdymas grįžta į tašką po await, ir metodas tęsiasi išsaugotu būsenos.
// Asinchroninis metodas
async Task<int> GetLengthAsync(string url)
{
    // Sukuriame HTTP klientą
    using var client = new HttpClient(); 
    // Atlikti asinchroninį užklausą URL
    // `await` laukia užklausos pabaigos, neblokuodamas srauto
    string content = await client.GetStringAsync(url); 
    // Tęsinys vykdomas po turinio gavimo
    return content.Length; 
}

// Asinchroninio metodo naudojimas
async void Button_Click(object sender, EventArgs e)
{
    // Laukia GetLengthAsync pabaigos
    // UI srautas neblokuojamas
    int length = await GetLengthAsync("https://example.com"); 
    // Atnaujina UI elementą
    Label1.Text = $"Turinio ilgis: {length}"; 
}