Sobes.tech
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.

  1. Trefwoord async: Markeert een methode als asynchroon. Zo'n methode kan de instructie await bevatten.
  2. Trefwoord await: Wordt gebruikt voordat een asynchrone operatie wordt aangeroepen (meestal een methode die Task of Task<T> retourneert). Wanneer de uitvoering await bereikt, wordt de controle teruggegeven aan de aanroepende methode, en kan de vrijgekomen thread ander werk doen.
  3. Task / Task<T>: Vertegenwoordigt een belofte dat een asynchrone operatie voltooid zal worden en het resultaat ervan (voor Task<T>). await "wacht" op de voltooiing van deze "belofte".
  4. Toestandsmachine: De compiler transformeert de asynchrone methode in een toestandsmachine. Deze bewaart de toestand van de methode bij het bereiken van await.
  5. 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.
  6. 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}"; 
}