首页 > 解决方案 > 消毒异步方法c#的最佳方法

问题描述

在花了太多时间试图解决异步/等待地狱之后,我们试图获得一个标准,当我们必须在我们无法控制的库上调用异步方法并且没有提供非异步方法时,以及一起从我们的代码中获取异步。

我不想讨论这个的优点我敢肯定,对于某些人来说 async/await 工作,只是调用任何异步方法并且不会出现死锁等的万无一失的方法。

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

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

做这份工作?我需要配置等待(假)吗?异常会正常工作吗?

标签: c#async-await

解决方案


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

也就是说,我的 Brownfield Async 文章中涵盖了各种 hack除非第三方库需要使用当前上下文,否则您建议的那个 - “线程池黑客” - 将起作用。例如,如果它是一个希望在可以访问 UI 控件的场景中运行的方法,或者如果它希望拥有HttpContext.Current. 大多数图书馆不需要这个,所以这个 hack 对他们有用。

没有任何黑客可以在所有场景中无处不在。

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

对于例外情况,您应该使用GetAwaiter().GetResult()代替Resultand Wait()。这可以防止异常被包裹在AggregateException.


推荐阅读