我需要在 catch
块中调用一个 async
方法,然后再抛出异常(包括其堆栈跟踪) ,如下所示:
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
但不幸的是,您不能在 catch
或 finally
块中使用 await
。我了解到,这是因为编译器没有任何方法返回到 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());
}
所以我的问题是: 你认为这个代码可以吗?
当然,如果您有一些增强或者知道更好的方法,我洗耳恭听! :)