J'ai besoin d'appeler une async
méthode dans un catch
bloc 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 await
dans un bloc catch
ou finally
. J'ai appris que c'est parce que le compilateur n'a aucun moyen de revenir en arrière dans un catch
bloc pour exécuter ce qui se trouve après votre await
instruction ou quelque chose comme ça ...
J'ai essayé d'utiliser Task.Wait()
pour remplacer await
et 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 async
mé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! :)
await
dans un bloc catch est en fait autorisée depuis C # 6.0 (voir ma réponse ci-dessous)