Ho bisogno di chiamare un metodo async
in un blocco catch
prima di lanciare di nuovo l'eccezione (con il suo stack trace) come questo:Una buona soluzione per attendere in try/catch/finally?
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
Ma purtroppo non è possibile utilizzare await
in un blocco catch
o finally
. Ho imparato è perché il compilatore non ha alcun modo per tornare indietro in un blocco catch
da eseguire ciò che è dopo la vostra istruzione await
o qualcosa del genere ...
ho cercato di usare Task.Wait()
per sostituire await
e ho ottenuto un deadlock. Ho cercato sul Web come evitare ciò e ho trovato this site.
Non potendo cambiare i metodi async
né so se usano ConfigureAwait(false)
, ho creato questi metodi che prendono un Func<Task>
che avvia un metodo asincrono volta siamo su un thread diverso (per evitare una situazione di stallo) e attende per il suo completamento:
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());
}
Quindi le mie domande sono: Pensi che questo codice sia a posto?
Ovviamente, se si dispone di alcuni miglioramenti o si conosce un approccio migliore, sto ascoltando! :)
L'utilizzo di 'await' in un blocco catch è effettivamente consentito poiché C# 6.0 (vedere la mia risposta di seguito) –
Related ** C# 5.0 ** messaggi di errore: *** CS1985 ***: * Impossibile attendere nel corpo di un clausola catch. * *** CS1984 ***: * Impossibile attendere nel corpo di una clausola finally. * – DavidRR