Sobes.tech
Middle

Kuidas töötab async/await mehhanism C#-s?

sobes.tech AI

Vastus AI-lt

async/await mehhanism võimaldab kirjutada asünkroonset koodi, mis näeb välja nagu sünkrone.

  1. Võtmesõna async: märgib meetodit kui asünkroonset. Selline meetod võib sisaldada await operaatorit.
  2. Võtmesõna await: kasutatakse enne asünkroonse operatsiooni (tavaliselt meetod, mis tagastab Task või Task<T>). Kui täitmine jõuab await-i, antakse juhtimine tagasi kutsuvale meetodile ning vabastatud niit võib teha muud tööd.
  3. Task / Task<T>: esindab lubadust, et asünkroonne operatsioon lõpeb ning selle tulemus (kui Task<T>) on saadaval. await "oodab" selle "lubaduse" lõppemist.
  4. Oleku masin: kompilaator teisendab asünkroonse meetodi lõplikuks automaadiks. See automaat salvestab meetodi oleku await-i saavutamisel.
  5. Jätkamine: kui oodatav ülesanne lõpeb, plaanib täitmise keskkond jätkata asünkroonse meetodi ülejäänud osa (jätku) sama niidi või samas sünkroniseerimiskontekstis, kui see on haaratud.
  6. Juhtimise tagastamine: pärast asünkroonse operatsiooni lõppu tagastatakse juhtimine await-i järgsesse punkti ning meetod jätkub salvestatud olekuga.
// Asünkroonne meetod
async Task<int> GetLengthAsync(string url)
{
    // Loome HTTP-klienti
    using var client = new HttpClient(); 
    // Teeme asünkroonse päringu URL-ile
    // `await` ootab päringu lõppu, mitte ei blokeeri niiti
    string content = await client.GetStringAsync(url); 
    // Jätkamine toimub pärast sisu saamist
    return content.Length; 
}

// Asünkroonse meetodi kasutamine
async void Button_Click(object sender, EventArgs e)
{
    // Ootab GetLengthAsync lõppu
    // UI-niit ei blokeeru
    int length = await GetLengthAsync("https://example.com"); 
    // Uuendab UI elementi
    Label1.Text = $"Sisu pikkus: {length}"; 
}