Ho bisogno di chiamare un async
metodo in un catch
blocco prima di lanciare di nuovo l'eccezione (con la sua traccia dello stack) in questo modo:
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
Ma purtroppo non è possibile utilizzare await
in una catch
o di finally
blocco. Ho imparato che è perché il compilatore non ha alcun modo per tornare indietro in un catch
blocco per eseguire ciò che è dopo la tua await
istruzione o qualcosa del genere ...
Ho provato a utilizzare Task.Wait()
per sostituire await
e ho ottenuto un deadlock. Ho cercato sul Web come avrei potuto evitarlo e ho trovato questo sito .
Dato che non posso cambiare i async
metodi né so se usano ConfigureAwait(false)
, ho creato questi metodi che prendono un Func<Task>
metodo che avvia un metodo asincrono una volta che siamo su un thread diverso (per evitare un deadlock) e attende 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 la mia domanda è: pensi che questo codice vada bene?
Ovviamente, se hai qualche miglioramento o conosci un approccio migliore, ti sto ascoltando! :)
await
in un blocco catch è effettivamente consentito da C # 6.0 (vedere la mia risposta di seguito)