Middle
Hoe werkt het async/await-mechanisme in C#?
sobes.tech AI
Antwoord van AI
Het async/await-mechanisme maakt het mogelijk om asynchrone code te schrijven die eruitziet als synchrone code.
- Trefwoord
async: Markeert een methode als asynchroon. Zo'n methode kan de instructieawaitbevatten. - Trefwoord
await: Wordt gebruikt voordat een asynchrone operatie wordt aangeroepen (meestal een methode dieTaskofTask<T>retourneert). Wanneer de uitvoeringawaitbereikt, wordt de controle teruggegeven aan de aanroepende methode, en kan de vrijgekomen thread ander werk doen. Task/Task<T>: Vertegenwoordigt een belofte dat een asynchrone operatie voltooid zal worden en het resultaat ervan (voorTask<T>).await"wacht" op de voltooiing van deze "belofte".- Toestandsmachine: De compiler transformeert de asynchrone methode in een toestandsmachine. Deze bewaart de toestand van de methode bij het bereiken van
await. - Vervolg: Wanneer de verwachte taak voltooid is, plant de runtime de uitvoering van het resterende deel van de asynchrone methode (de voortzetting) op een thread uit de threadpool of op dezelfde synchronisatiecontext als deze is vastgelegd.
- Controle teruggeven: Na het voltooien van de asynchrone operatie, wordt de controle teruggegeven aan het punt na
await, en wordt de uitvoering van de methode voortgezet met de opgeslagen toestand.
// Asynchrone methode
async Task<int> GetLengthAsync(string url)
{
// Maak een HTTP-client
using var client = new HttpClient();
// Voer een asynchrone aanvraag uit naar de URL
// Await wacht op de voltooiing van de aanvraag zonder de thread te blokkeren
string content = await client.GetStringAsync(url);
// De voortzetting wordt uitgevoerd nadat de inhoud is verkregen
return content.Length;
}
// Gebruik van de asynchrone methode
async void Button_Click(object sender, EventArgs e)
{
// Await wacht tot GetLengthAsync klaar is
// De UI-thread wordt niet geblokkeerd
int length = await GetLengthAsync("https://example.com");
// Werk het UI-element bij
Label1.Text = $"Inhoudslengte: {length}";
}