J'ai besoin de faire appel à un async
méthode de catch
- bloc avant de le lancer à nouveau l'exception (avec son stack trace) comme ceci :
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
Mais, malheureusement, vous ne pouvez pas utiliser await
en catch
ou finally
bloc. J'ai appris que c'est parce que le compilateur n'a aucun moyen de revenir en arrière dans un catch
bloc à exécuter ce qui est après votre await
instruction ou quelque chose comme ça...
J'ai essayé d'utiliser Task.Wait()
pour remplacer await
et j'ai eu un blocage. J'ai cherché sur le Web comment je pourrais éviter cela et trouvé ce site.
Puisque je ne peux pas changer l' async
méthodes, ni je ne sais si ils utilisent ConfigureAwait(false)
, j'ai créé ces méthodes qui prennent un Func<Task>
qui démarre une méthode async une fois que nous sommes sur un thread différent (pour éviter une situation de 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());
}
Donc mes questions: pensez-vous que ce code est correct?
Bien sûr, si vous avez des améliorations ou en connaissez une meilleure approche, je suis à l'écoute! :)