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! :)