Ich brauche eine async
Methode in einem catch
Block aufrufen, bevor wieder die Ausnahme zu werfen (mit seinem Stack-Trace) wie folgt aus:Eine gute Lösung für warten in Versuch/Fang/endlich?
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, es ist, weil der Compiler keine Möglichkeit hat in einem catch
Block zurück zu gehen auszuführen, was nach Ihrer await
Anweisung oder so ähnlich ist ...
Ich versuchte Task.Wait()
zu verwenden await
zu ersetzen, und ich bekam eine Sackgasse. Ich habe im Internet gesucht, wie ich das vermeiden konnte und habe this site gefunden.
Da kann ich nicht die async
Methoden ändern, noch weiß ich, ob sie ConfigureAwait(false)
verwenden, ich diese Methoden erstellt, die ein Func<Task>
nehmen, die ein asynchrones Verfahren beginnt, wenn wir auf einem anderen Thread (zu vermeiden, dass ein Deadlock) und wartet sind für seine Vollendung:
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());
}
So ist meine Fragen: glauben Sie, dieser Code in Ordnung ist?
Natürlich, wenn Sie einige Verbesserungen haben oder einen besseren Ansatz kennen, höre ich! :)
Verwendung von 'erwarten' in einem catch-Block ist tatsächlich erlaubt seit C# 6.0 (siehe meine Antwort unten) –
Verwandte ** C# 5.0 ** Fehlermeldungen: *** CS1985 ***: * Kann nicht im Körper eines a erwarten catch-Klausel. * *** CS1984 ***: * Kann im Body einer finally-Klausel nicht abwarten. * – DavidRR