在花费大量时间试图清理异步/等待地狱之后,我们试图为何时必须在我们无法控制的库上调用异步方法以及在何处存在非异步提供标准提供的方法,使我们的代码完全不同步。
我不想讨论这种方法的优点,我敢肯定,对于某些人来说,异步/等待工作是可行的,只是一种简单的方法来调用任何异步方法而不会出现死锁等。
是
public someObject SomeFunction(string parameter)
{
return Task.Run(() => 3rdPartyLib.SomeFunctionAsync(parameter)).Result;
}
和
public void SomeMethod()
{
return Task.Run(() => 3rdPartyLib.SomeMethodAsync()).Wait;
}
工作吗?我是否需要configureAwait(false)?例外会正常工作吗?
答案 0 :(得分:5)
好吧,也写synchronous wrappers for asynchronous methods is an antipattern。
也就是说,有一个variety of hacks covered in my Brownfield Async article。除非第三方库要求使用当前上下文,否则您建议的“线程池黑客”将有效。例如,如果该方法希望在可以访问UI控件的情况下运行,或者希望具有HttpContext.Current
。 大多数库不需要此库,因此此技巧对其适用。
在所有情况下,没有处处都可以使用的黑客工具。
您不需要ConfigureAwait(false)
。没有await
可以配置。
对于例外情况,应使用GetAwaiter().GetResult()
而不是Result
和Wait()
。这样可以防止将异常包装在AggregateException
中。