我需要在 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());
}
因此,我的问题是:您认为这段代码是否可行?
当然,如果您有其他改进方法或知道更好的方法,请告诉我! :)
await
(请参见下面的答案)。 - Adi Lester