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

questionAnswers(4)

yourAnswerToTheQuestion