Preciso chamar um async
método em um catch
bloco 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 await
em um bloco catch
ou finally
. Aprendi que é porque o compilador não tem como voltar em um catch
bloco para executar o que está depois de sua await
instrução ou algo assim ...
Tentei usar Task.Wait()
para substituir await
e obtive um impasse. Pesquisei na Web como poderia evitar isso e encontrei este site .
Como não posso alterar os async
mé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! :)
await
em um bloco catch é permitido desde C # 6.0 (veja minha resposta abaixo)