Хорошее решение для ожидания в try / catch / finally?

Мне нужно позвонитьasync метод вcatch блок, прежде чем снова выдать исключение (с его трассировкой стека) следующим образом:

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

Но, к сожалению, вы не можете использоватьawait вcatch или жеfinally блок. Я узнал, что это потому, что компилятор не имеет никакого способа вернуться вcatch блок, чтобы выполнить то, что после вашегоawait инструкция или что-то в этом роде ...

Я пытался использоватьTask.Wait() заменитьawait и я зашел в тупик. Я искал в Интернете, как я мог избежать этого и нашелэтот сайт.

Так как я не могу изменитьasync методы, и я не знаю, если они используютConfigureAwait(false), Я создал эти методы, которые принимаютFunc<,Task> который запускает асинхронный метод, когда мы находимся в другом потоке (чтобы избежать тупика) и ожидает его завершения:

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());
}

Итак, мои вопросы: как вы думаете, этот код в порядке?

Конечно, если у вас есть какие-то улучшения или вы знаете лучший подход, я слушаю! :)

Ответы на вопрос(4)

Ваш ответ на вопрос