J'ai besoin d'appeler une asyncméthode dans un catchbloc avant de lancer à nouveau l'exception (avec sa trace de pile) comme ceci:
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
Mais malheureusement, vous ne pouvez pas utiliser awaitdans un bloc catchou finally. J'ai appris que c'est parce que le compilateur n'a aucun moyen de revenir en arrière dans un catchbloc pour exécuter ce qui se trouve après votre awaitinstruction ou quelque chose comme ça ...
J'ai essayé d'utiliser Task.Wait()pour remplacer awaitet j'ai eu une impasse. J'ai cherché sur le Web comment éviter cela et j'ai trouvé ce site .
Comme je ne peux pas changer les asyncméthodes et que je ne sais pas si elles utilisent ConfigureAwait(false), j'ai créé ces méthodes qui prennent un Func<Task>qui démarre une méthode asynchrone une fois que nous sommes sur un thread différent (pour éviter un blocage) et attend son achèvement:
public static void AwaitTaskSync(Func<Task> action)
{
Task.Run(async () => await action().ConfigureAwait(false)).Wait();
}
public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> action)
{
return Task.Run(async () => await action().ConfigureAwait(false)).Result;
}
public static void AwaitSync(Func<IAsyncAction> action)
{
AwaitTaskSync(() => action().AsTask());
}
public static TResult AwaitSync<TResult>(Func<IAsyncOperation<TResult>> action)
{
return AwaitTaskSync(() => action().AsTask());
}
Ma question est donc la suivante: pensez-vous que ce code est correct?
Bien sûr, si vous avez des améliorations ou connaissez une meilleure approche, je vous écoute! :)
awaitdans un bloc catch est en fait autorisée depuis C # 6.0 (voir ma réponse ci-dessous)