Pourquoi les méthodes asynchrones non attendues ne génèrent-elles pas d’exceptions?

Je pensais que les méthodes asynchrones étaient supposées se comporter comme des méthodes normales jusqu’à ce qu’elles arrivent à l’attente.

Pourquoi cela ne jette-t-il pas une exception?

Existe-t-il un moyen de lever l’exception sans attendre?

using System; using System.Threading.Tasks; public class Test { public static void Main() { var t = new Test(); t.Helper(); } public async Task Helper() { throw new Exception(); } } 

Une exception levée dans une méthode async est, par sa conception, stockée dans la tâche renvoyée. Pour mettre la main sur l’exception, vous pouvez:

  1. await la tâche: await t.Helper();
  2. Wait la tâche: t.Helper().Wait();
  3. Vérifiez la propriété Exception de la tâche une fois celle-ci terminée: var task = t.Helper(); Log(task.Exception); var task = t.Helper(); Log(task.Exception);
  4. Ajoutez une continuation à cette tâche qui gère l’exception: t.Helper().ContinueWith(t => Log(t.Exception), TaskContinuationOptions.OnlyOnFaulted);

Votre meilleure option est la première. Attendez simplement la tâche et gérez l’exception (à moins d’une raison spécifique pour laquelle vous ne pouvez pas le faire). Plus dans Gestion des exceptions de tâches dans .NET 4.5