BLOG · C# · BONNES PRATIQUES

8 erreurs async/await qui font planter vos applications C# (et comment les corriger)

Illustration : le mot-clé await en rose dans une fenêtre de code

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 ↗