Programmation asynchrone en C# : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction à la programmation asynchrone en C#



La programmation asynchrone est l'un des concepts clés du développement moderne en C#. À l'ère des applications web à forte charge, des microservices et des solutions cloud, la capacité à travailler efficacement avec l'asynchronisme est devenue une compétence obligatoire pour chaque développeur .NET.



L'objectif principal de la programmation asynchrone est de ne pas bloquer le thread d'exécution pendant l'attente d'opérations longues (entrées-sorties, travail réseau, requêtes à la base de données). Au lieu de cela, le thread est libéré pour traiter d'autres tâches, ce qui améliore considérablement les performances et l'évolutivité de l'application.



Dans cet article, nous allons aborder :

  • Les bases de async/await en C#
  • Le travail avec la classe Task
  • Les règles d'écriture des méthodes asynchrones
  • Les erreurs typiques et les moyens de les éviter


Les bases de async/await en C#



Le paradigme clé de la programmation asynchrone en C# repose sur deux mots-clés : async et await. Ils ont été introduits dans C# 5.0 et sont depuis devenus la norme pour travailler avec l'asynchronisme.



Comment fonctionne async/await



Le mot-clé async est utilisé pour déclarer une méthode asynchrone. await est appliqué à une tâche (Task) pour suspendre l'exécution de la méthode jusqu'à son achèvement, sans bloquer le thread actuel.



public async Task<string> GetDataAsync(){    // Simulation d'une requête HTTP asynchrone    using var client = new HttpClient();    string result = await client.GetStringAsync("https://api.example.com/data");    return result;}

public async Task ProcessAsync(){ string data = await GetDataAsync(); Console.WriteLine($"Données reçues : {data}");}


Il est important de comprendre : await ne bloque pas le thread. Il cède le contrôle au code appelant, et lorsque la tâche se termine, la méthode reprend son exécution là où elle s'était arrêtée.



Types de valeurs de retour des méthodes asynchrones



Une méthode asynchrone peut retourner l'un des trois types suivants :

  • Task — pour les méthodes qui ne retournent pas de valeur
  • Task<T> — pour les méthodes qui retournent une valeur de type T
  • ValueTask<T> — pour les scénarios à hautes performances, lorsque le résultat est souvent disponible de manière synchrone


// Sans valeur de retourpublic async Task SaveDataAsync(string data){    await File.WriteAllTextAsync("data.txt", data);}

// Avec valeur de retourpublic async Task<int> CalculateSumAsync(int a, int b){ await Task.Delay(100); // Simulation d'une opération longue return a + b;}

// ValueTask pour l'optimisationpublic async ValueTask<bool> CheckCacheAsync(string key){ if (_cache.ContainsKey(key)) return true; await Task.Delay(50); return false;}


Travail avancé avec Task



La classe Task est la base de la programmation asynchrone en C#. Examinons les méthodes et les modèles les plus utiles.



Exécution parallèle des tâches



Les méthodes Task.WhenAll et Task.WhenAny permettent de gérer efficacement plusieurs opérations asynchrones.



public async Task ProcessMultipleRequestsAsync(){    var task1 = FetchDataAsync("url1");    var task2 = FetchDataAsync("url2");    var task3 = FetchDataAsync("url3");        // Attente de l'achèvement de toutes les tâches    await Task.WhenAll(task1, task2, task3);        Console.WriteLine("Toutes les requêtes sont terminées");}

public async Task<string> GetFirstResponseAsync(){ var task1 = FetchDataAsync("url1"); var task2 = FetchDataAsync("url2"); // Attente de la première tâche terminée Task<string> completedTask = await Task.WhenAny(task1, task2); return await completedTask;}


Annulation des opérations asynchrones

Blogs

Book Recommendations