Sobes.tech
Middle

Kā darbojas async/await mehānisms C#-ā?

sobes.tech AI

Atbilde no AI

async/await mehānisms ļauj rakstīt asinhronu kodu, kas izskatās kā sinhrons.

  1. Atslēgvārds async: atzīmē metodi kā asinhronu. Šāda metode var saturēt await operatoru.
  2. Atslēgvārds await: tiek izmantots pirms asinhronas operācijas izsaukšanas (parasti metodes, kas atgriež Task vai Task<T>). Kad izpilde sasniedz await, kontrole tiek atgriezta izsaucējam metodam, un brīvais pavedienis var veikt citu darbu.
  3. Task / Task<T>: pārstāv solījumu, ka asinhrona operācija tiks pabeigta un tās rezultāts (ja Task<T>) būs pieejams. await "gaida" šī "solījuma" pabeigšanu.
  4. Stāvokļa mašīna: kompilators pārvērš asinhrono metodi par galīgo automātu. Šis automāts saglabā metodes stāvokli, sasniedzot await.
  5. Turpinājums: kad gaidāmā uzdevuma pabeigšana notiek, izpildes vide plāno izpildīt atlikušās asinhronās metodes daļas (turpinājumu) pēc pavediena no pavedienu groza vai tajā pašā sinhronizācijas kontekstā, ja tas ir aizķerts.
  6. Vadības atgriešana: pēc asinhronas operācijas pabeigšanas vadība tiek atgriezta pie punkta pēc await, un metode turpinās ar saglabāto stāvokli.
// Asinhronā metode
async Task<int> GetLengthAsync(string url)
{
    // Izveido HTTP klientu
    using var client = new HttpClient(); 
    // Veic asinhronu pieprasījumu uz URL
    // `await` gaida pieprasījuma pabeigšanu, neblokējot pavedienu
    string content = await client.GetStringAsync(url); 
    // Turpinājums tiek izpildīts pēc satura saņemšanas
    return content.Length; 
}

// Asinhronas metodes izmantošana
async void Button_Click(object sender, EventArgs e)
{
    // Gaidīt GetLengthAsync pabeigšanu
    // UI pavedienu neblokē
    int length = await GetLengthAsync("https://example.com"); 
    // Atjaunina UI elementu
    Label1.Text = $"Satura garums: {length}"; 
}