Eine gute Lösung, um in try / catch / finally zu warten?

Ich muss anrufenasync Methode in acatch blockiere, bevor du die Exception (mit ihrem Stack-Trace) erneut wirfst:

try
{
    // Do something
}
catch
{
    // <- Clean things here with async methods
    throw;
}

Aber leider kann man nicht verwendenawait in einemcatch oderfinally Block. Ich habe gelernt, dass es daran liegt, dass der Compiler keine Möglichkeit hat, in a zurückzukehrencatch Block, um auszuführen, was nach Ihrem istawait anweisung oder so ...

Ich habe versucht zu verwendenTask.Wait() ersetzenawait und ich habe eine Sackgasse. Ich habe im Web gesucht, wie ich das vermeiden kann und habe herausgefundenDiese Seite.

Da kann ich das nicht ändernasync Methoden noch weiß ich, ob sie verwendenConfigureAwait(false)Ich habe diese Methoden erstellt, die eineFunc<Task> Das startet eine asynchrone Methode, sobald wir uns in einem anderen Thread befinden (um einen Deadlock zu vermeiden) und wartet auf deren Fertigstellung:

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 lauten also: Glaubst du, dieser Code ist in Ordnung?

Natürlich höre ich zu, wenn Sie einige Verbesserungen haben oder einen besseren Ansatz kennen! :)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage