Ich muss eine async
Methode in einem catch
Block aufrufen , bevor ich die Ausnahme (mit ihrer Stapelverfolgung) erneut wie folgt auslösen kann:
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
Aber leider kann man nicht await
in einem catch
oder finally
Block verwenden. Ich habe gelernt, dass der Compiler keine Möglichkeit hat, in einen catch
Block zurückzukehren, um das auszuführen, was nach Ihrer await
Anweisung oder so ist ...
Ich habe versucht zu Task.Wait()
ersetzen await
und ich habe einen Deadlock. Ich habe im Web gesucht, wie ich dies vermeiden kann, und diese Website gefunden .
Da ich die async
Methoden nicht ändern kann und auch nicht weiß, ob sie verwendet werden ConfigureAwait(false)
, habe ich diese Methoden erstellt Func<Task>
, die eine asynchrone Methode starten, sobald wir uns in einem anderen Thread befinden (um einen Deadlock zu vermeiden) und auf deren Abschluss warten:
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());
}
Meine Fragen sind also: Glaubst du, dieser Code ist in Ordnung?
Natürlich höre ich zu, wenn Sie einige Verbesserungen haben oder einen besseren Ansatz kennen! :) :)
await
in einem Catch-Block ist seit C # 6.0 tatsächlich zulässig (siehe meine Antwort unten)