消毒异步方法的最佳方法c#

dib*_*487 -2 c# async-await

在花了太多时间试图解决async/await hell后,我们试图获得一个标准,当我们必须在我们无法控制的库上调用异步方法时,以及没有提供非异步方法的地方从我们的代码中一起得到异步.

我不想讨论这个优点我确信对于某些人async/await工作,只是一种简单的方法来调用任何异步方法而不会出现死锁等.

是否

public someObject SomeFunction(string parameter)
{
    return Task.Run(() => 3rdPartyLib.SomeFunctionAsync(parameter)).Result;
}
Run Code Online (Sandbox Code Playgroud)

public void SomeMethod()
{
    return Task.Run(() => 3rdPartyLib.SomeMethodAsync()).Wait;
}
Run Code Online (Sandbox Code Playgroud)

做这个工作?我需要configureAwait(false)吗?异常会正常工作吗?

Ste*_*ary 5

好吧,为异步方法编写同步包装器也是一种反模式.

也就是说,我的Brownfield Async文章中有各种各样的黑客攻击.您建议的那个 - "线程池黑客" - 将起作用,除非第三方库需要使用当前上下文.例如,如果它是一种期望在可以访问UI控件的情况下运行的方法,或者它希望具有的方法HttpContext.Current.大多数图书馆不需要这样,所以这个黑客对他们有用.

在所有情况下,没有任何黑客可以在任何地方使用.

你不需要ConfigureAwait(false).没有await配置.

对于例外,您应该使用GetAwaiter().GetResult()而不是ResultWait().这可以防止异常被包装AggregateException.