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.
- Raktinis žodis
async: pažymi metodą kaip asinchroninį. Toks metodas gali turėtiawaitoperatorių. - Raktinis žodis
await: naudojamas prieš iškviečiant asinchroninę operaciją (paprastai metodą, kuris grąžinaTaskarbaTask<T>). Kai vykdymas pasiekiaawait, valdymas grįžta iškviečiančiam metodui, o laisvas srautas gali vykdyti kitą darbą. Task/Task<T>: atstovauja pažadą, kad asinchroninė operacija bus baigta ir jos rezultatas (jeiTask<T>).await"laukia" šio "pažado" pabaigos.- Būsenų mašina: kompiliatorius paverčia asinchroninį metodą galutine automatine mašina. Ši mašina išsaugo metodo būseną pasiekus
await. - 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.
- 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}";
}