【发布时间】:2013-05-13 15:10:29
【问题描述】:
在再次抛出异常(及其堆栈跟踪)之前,我需要在 catch 块中调用 async 方法,如下所示:
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
但不幸的是,您不能在 catch 或 finally 块中使用 await。我了解到这是因为编译器没有任何方法可以返回 catch 块来执行您的 await 指令或类似指令之后的内容......
我尝试使用Task.Wait() 替换await,但遇到了死锁。我在网上搜索了如何避免这种情况,发现this site。
由于我无法更改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());
}
所以我的问题是:你认为这段代码可以吗?
当然,如果您有一些改进或知道更好的方法,我在听! :)
【问题讨论】:
-
自 C# 6.0 起实际上允许在 catch 块中使用
await(请参阅下面的答案) -
相关 C# 5.0 错误消息:CS1985:无法在 catch 子句的主体中等待。 CS1984:不能在 finally 子句的主体中等待。
标签: c# .net exception-handling async-await c#-5.0