Necesito llamar a un asyncmétodo en un catchbloque antes de lanzar nuevamente la excepción (con su seguimiento de pila) como este:
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
Pero desafortunadamente no puedes usarlo awaiten un bloque catcho finally. Aprendí que es porque el compilador no tiene forma de retroceder en un catchbloque para ejecutar lo que está después de tu awaitinstrucción o algo así ...
Traté de usar Task.Wait()para reemplazar awaity obtuve un punto muerto. Busqué en la Web cómo podía evitarlo y encontré este sitio .
Como no puedo cambiar los asyncmétodos ni sé si se usan ConfigureAwait(false), creé estos métodos que toman un Func<Task>método que inicia un método asíncrono una vez que estamos en un hilo diferente (para evitar un punto muerto) y espera a que se complete:
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());
}
Entonces mi pregunta es: ¿Crees que este código está bien?
Por supuesto, si tiene algunas mejoras o conoce un enfoque mejor, ¡lo escucho! :)
fuente

awaiten un bloque de captura está realmente permitido desde C # 6.0 (vea mi respuesta a continuación)