Preciso chamar um asyncmétodo em um catchbloco antes de lançar novamente a exceção (com seu rastreamento de pilha) como este:
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
Mas, infelizmente, você não pode usar awaitem um bloco catchou finally. Aprendi que é porque o compilador não tem como voltar em um catchbloco para executar o que está depois de sua awaitinstrução ou algo assim ...
Tentei usar Task.Wait()para substituir awaite obtive um impasse. Pesquisei na Web como poderia evitar isso e encontrei este site .
Como não posso alterar os asyncmétodos nem sei se eles usam ConfigureAwait(false), criei esses métodos que usam um Func<Task>que inicia um método assíncrono quando estamos em um thread diferente (para evitar um deadlock) e aguarda sua conclusão:
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());
}
Portanto, minhas perguntas são: Você acha que este código está correto?
Claro, se você tiver algumas melhorias ou conhecer uma abordagem melhor, estou ouvindo! :)
awaitem um bloco catch é permitido desde C # 6.0 (veja minha resposta abaixo)