Sobes.tech
Middle

Comment fonctionne le mécanisme async/await en C#?

sobes.tech IA

Réponse de l'IA

Le mécanisme async/await permet d'écrire du code asynchrone qui ressemble à du code synchrone.

  1. Mot-clé async : Marque une méthode comme asynchrone. Une telle méthode peut contenir l'instruction await.
  2. Mot-clé await : Utilisé avant d'appeler une opération asynchrone (généralement une méthode retournant Task ou Task<T>). Lorsque l'exécution atteint await, le contrôle est rendu à la méthode appelante, et le thread libéré peut effectuer une autre tâche.
  3. Task / Task<T> : Représente une promesse de compléter une opération asynchrone et son résultat (pour Task<T>). await "attend" la complétion de cette "promesse".
  4. Machine à états : Le compilateur transforme la méthode asynchrone en une machine à états. Cette machine conserve l'état de la méthode lorsqu'elle atteint await.
  5. Continuation : Lorsque la tâche attendue se termine, l'environnement d'exécution planifie l'exécution de la partie restante de la méthode asynchrone (la continuation) sur un thread du pool ou dans le même contexte de synchronisation si celui-ci est capturé.
  6. Retour du contrôle : Après la fin de l'opération asynchrone, le contrôle revient au point après await, et l'exécution de la méthode continue avec l'état sauvegardé.
// Méthode asynchrone
async Task<int> GetLengthAsync(string url)
{
    // Créer un client HTTP
    using var client = new HttpClient(); 
    // Effectuer une requête asynchrone à l'URL
    // Await attend la fin de la requête sans bloquer le thread
    string content = await client.GetStringAsync(url); 
    // La continuation s'exécute après avoir obtenu le contenu
    return content.Length; 
}

// Utilisation de la méthode asynchrone
async void Button_Click(object sender, EventArgs e)
{
    // Await attend la fin de GetLengthAsync
    // Le thread UI n'est pas bloqué
    int length = await GetLengthAsync("https://example.com"); 
    // Mettre à jour l'élément UI
    Label1.Text = $"Longueur du contenu : {length}"; 
}