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:
await
la tâche: await t.Helper();
Wait
la tâche: t.Helper().Wait();
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);
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