Programmation asynchrone en C# : guide complet pour .NET

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 un paradigme fondamental dans le développement moderne en C# (.NET), permettant de créer des applications réactives et performantes. Contrairement à l'approche synchrone où l'exécution du code bloque le thread actuel jusqu'à la fin de l'opération, le code asynchrone libère le thread pour exécuter d'autres tâches en attendant le résultat d'une opération longue (par exemple, une requête à une base de données, un appel HTTP ou une lecture de fichier).



Avec l'apparition des mots-clés async et await en C# 5.0, la programmation asynchrone a cessé d'être complexe et est devenue accessible à chaque développeur. Dans ce guide, nous allons détailler tous les concepts clés : des bases de Task et ValueTask à la gestion des erreurs et à l'annulation des opérations.



Fondamentaux de async/await et Task



Qu'est-ce que Task et Task<TResult>



Task est le type central dans TPL (Task Parallel Library), représentant une opération asynchrone. Task (sans valeur de retour) et Task<TResult> (avec valeur de retour) sont les blocs de construction du code asynchrone.



// Méthode asynchrone simple sans valeur de retourpublic async Task DoSomethingAsync(){    await Task.Delay(1000);    Console.WriteLine("Terminé !");}

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


Mots-clés async et await



Le modificateur async indique au compilateur que la méthode contient du code asynchrone. L'opérateur await suspend l'exécution de la méthode jusqu'à la fin de la tâche attendue, sans bloquer le thread.



public async Task ProcessDataAsync(){    Console.WriteLine("Début du traitement...");        // Attente asynchrone — le thread n'est pas bloqué    string result = await FetchDataFromApiAsync();        Console.WriteLine($"Résultat obtenu : {result}");}


Règles d'utilisation de async/await



  • N'utilisez pas async void (sauf pour les gestionnaires d'événements) — cela rend impossible le suivi des exceptions.
  • Évitez les appels bloquants (.Result, .Wait()) — ils peuvent entraîner des deadlocks.
  • Nommez les méthodes asynchrones avec le suffixe "Async" pour plus de clarté.


Techniques avancées : ValueTask, CancellationToken et parallélisme



ValueTask vs Task



ValueTask est une optimisation pour les cas où l'opération asynchrone se termine souvent de manière synchrone (par exemple, données en cache). Contrairement à Task qui est un type référence, ValueTask est une structure, ce qui réduit la charge sur le garbage collector.



public ValueTask<int> GetCachedOrFetchAsync(int id){    if (cache.ContainsKey(id))    {        // Terminaison synchrone — sans allocation mémoire        return new ValueTask<int>(cache[id]);    }    // Terminaison asynchrone    return new ValueTask<int>(FetchFromDatabaseAsync(id));}


Annulation des opérations avec CancellationToken



CancellationToken permet d'interrompre correctement les opérations asynchrones longues. Transmettez toujours le jeton d'annulation si la méthode l'accepte.



public async Task<string> DownloadFileAsync(string url, CancellationToken ct){    using var client = new HttpClient();    var response = await client.GetAsync(url, ct); // ct est transmis à l'API    return await response.Content.ReadAsStringAsync();}

// Utilisationvar cts = new CancellationTokenSource();cts.CancelAfter(TimeSpan.FromSeconds(5)); // Délai d'attente de 5 secondes

try{ string data = await DownloadFileAsync("https://example.com", cts.Tok

Blogs

Book Recommendations