Sobes.tech
Middle

Cum funcționează mecanismul async/await în C#?

sobes.tech AI

Răspuns de la AI

Mecanismul async/await permite scrierea codului asincron care arată ca și codul sincron.

  1. Cuvântul cheie async: Marchează o metodă ca fiind asincronă. O astfel de metodă poate conține instrucțiunea await.
  2. Cuvântul cheie await: Este utilizat înainte de a apela o operație asincronă (de obicei o metodă care returnează Task sau Task<T>). Când execuția ajunge la await, controlul este returnat metodei apelante, iar firul de execuție eliberat poate efectua alte sarcini.
  3. Task / Task<T>: Reprezintă o promisiune de finalizare a unei operații asincrone și rezultatul acesteia (pentru Task<T>). await "așteaptă" finalizarea acestei "promisiuni".
  4. Mașina de stări: Compilatorul transformă metoda asincronă într-o mașină de stări. Această mașină păstrează starea metodei la atingerea await.
  5. Continuarea: Când sarcina așteptată se finalizează, mediul de execuție planifică executarea părții rămase a metodei asincrone (continuarea) pe un fir din pool-ul de fire sau în același context de sincronizare dacă acesta este capturat.
  6. Revenirea controlului: După finalizarea operației asincrone, controlul revine la punctul după await, iar execuția metodei continuă cu starea salvată.
// Metodă asincronă
async Task<int> GetLengthAsync(string url)
{
    // Crează client HTTP
    using var client = new HttpClient(); 
    // Efectuează o cerere asincronă către URL
    // Await așteaptă finalizarea cererii fără a bloca firul
    string content = await client.GetStringAsync(url); 
    // Continarea se execută după obținerea conținutului
    return content.Length; 
}

// Utilizarea metodei asincrone
async void Button_Click(object sender, EventArgs e)
{
    // Await așteaptă finalizarea lui GetLengthAsync
    // Firul UI nu este blocat
    int length = await GetLengthAsync("https://example.com"); 
    // Actualizează elementul UI
    Label1.Text = $"Lungimea conținutului: {length}"; 
}