8 erreurs async/await qui font planter vos applications C# (et comment les corriger)
Beaucoup de crashs en prod viennent d'une même source : async/await mal utilisé. Et ça peut pourrir n'importe quelle app C#.
On est tous passés par là : arriver sur un projet et découvrir que l'asynchrone est mal implémenté. Deadlocks en production, exceptions avalées, comportements imprévisibles... Voici 8 erreurs qui transforment votre code C# en générateur de bugs.
1. Ne pas utiliser await avec une méthode async
La méthode démarre mais votre code continue sans attendre. Les exceptions sont avalées et le résultat est ignoré.
// ❌ SomeAsyncMethod();
// ✅ await SomeAsyncMethod();
2. Utiliser async void au lieu de async Task
Impossible d'attendre ces méthodes, les exceptions remontent différemment et causent des crashs.
// ❌ async void MaMethode()
// ✅ async Task MaMethode()
3. Bloquer avec .Result ou .Wait()
Risque élevé de deadlock, surtout dans les applications UI et ASP.NET.
// ❌ var result = SomeAsyncMethod().Result;
// ✅ var result = await SomeAsyncMethod();
4. Ignorer le contexte de synchronisation
Les retours inutiles au thread principal (surtout en code non-UI) réduisent les performances.
// ❌ await SomeLongRunningMethodAsync();
// ✅ await SomeLongRunningMethodAsync().ConfigureAwait(false);
5. Mal gérer les exceptions asynchrones
Perte d'information pour le debugging et comportement imprévisible. Un simple try/catch sans propagation correcte ne suffit pas : capturez ET propagez les exceptions.
6. Abuser d'async pour des opérations synchrones
Surcoût inutile qui dégrade les performances de l'application.
// ❌ async Task<int> AddAsync(int a, int b) { return await Task.FromResult(a + b); }
// ✅ int Add(int a, int b) { return a + b; }
7. Utiliser Task.Run pour des tâches I/O
Gaspillage de threads pour des opérations qui sont déjà non-bloquantes par nature.
// ❌ await Task.Run(() => SomeIOMethod());
// ✅ await SomeIOMethodAsync();
8. Oublier de retourner un Task
Le code appelant ne peut pas savoir quand l'opération est terminée ni gérer ses erreurs.
// ❌ async void DoSomethingAsync() { SomeOtherAsyncMethod(); }
// ✅ async Task DoSomethingAsync() { await SomeOtherAsyncMethod(); }
À retenir : chacune de ces erreurs peut sembler mineure, mais chacune peut faire planter votre application en production. En les évitant, vous ne codez pas seulement plus propre : vous protégez votre business et votre santé mentale.
Cet article est tiré d'une de mes publications LinkedIn : rejoignez la discussion ↗