Necesito llamar a un async
método en un catch
bloque 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 await
en un bloque catch
o finally
. Aprendí que es porque el compilador no tiene forma de retroceder en un catch
bloque para ejecutar lo que está después de tu await
instrucción o algo así ...
Traté de usar Task.Wait()
para reemplazar await
y obtuve un punto muerto. Busqué en la Web cómo podía evitarlo y encontré este sitio .
Como no puedo cambiar los async
mé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! :)
await
en un bloque de captura está realmente permitido desde C # 6.0 (vea mi respuesta a continuación)