Dobre rozwiązanie dla oczekiwania w try / catch / finally?
Muszę zadzwonićasync
metoda w acatch
blok przed ponownym rzuceniem wyjątku (z jego śladem stosu) w następujący sposób:
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
Ale niestety nie możesz użyćawait
wcatch
lubfinally
blok. Dowiedziałem się, że to dlatego, że kompilator nie może w żaden sposób wrócićcatch
zablokuj, aby wykonać to, co jest po twoimawait
instrukcja lub coś w tym stylu ...
Próbowałem użyćTask.Wait()
zamienićawait
i dostałem impas. Szukałem w sieci, jak mogę tego uniknąć i znaleźćta strona.
Ponieważ nie mogę zmienićasync
metod ani nie wiem, czy używająConfigureAwait(false)
, Stworzyłem te metody, które biorąFunc<Task>
który uruchamia metodę asynchroniczną po znalezieniu innego wątku (aby uniknąć zakleszczenia) i czeka na jego zakończenie:
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());
}
Moje pytania brzmią: Czy uważasz, że ten kod jest w porządku?
Oczywiście, jeśli masz jakieś ulepszenia lub znasz lepsze podejście, słucham! :)