我需要async
在一个catch
块中调用一个方法,然后再次引发异常(及其堆栈跟踪),如下所示:
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
但是很遗憾,您不能await
在catch
或finally
块中使用。我了解到这是因为编译器没有任何办法可以返回一个catch
块来执行await
指令或类似指令之后的内容...
我试图用它Task.Wait()
来替换await
,但陷入僵局。我在网上搜索了如何避免这种情况的方法,并找到了该站点。
由于我无法更改async
方法,也无法知道它们是否在使用ConfigureAwait(false)
,因此创建了这些方法,这些方法采用a 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
自C#6.0起,实际上允许在catch块中使用(请参见下面的答案)