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.
- Cuvântul cheie
async: Marchează o metodă ca fiind asincronă. O astfel de metodă poate conține instrucțiuneaawait. - Cuvântul cheie
await: Este utilizat înainte de a apela o operație asincronă (de obicei o metodă care returneazăTasksauTask<T>). Când execuția ajunge laawait, controlul este returnat metodei apelante, iar firul de execuție eliberat poate efectua alte sarcini. Task/Task<T>: Reprezintă o promisiune de finalizare a unei operații asincrone și rezultatul acesteia (pentruTask<T>).await"așteaptă" finalizarea acestei "promisiuni".- 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. - 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.
- 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}";
}