我需要在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());
}
所以我的问题是:你认为这个代码行吗?
当然,如果您有一些增强功能或知道更好的方法,我会倾听您的意见!:)