Мне нужно вызвать 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());
}
Итак, мои вопросы: как вы думаете, этот код в порядке?
Конечно, если у вас есть улучшения или вы знаете лучший подход, я слушаю! :)
await
в блоке catch фактически разрешено с C # 6.0 (см. Мой ответ ниже)