C# 消除异步方法c的最佳方法#

C# 消除异步方法c的最佳方法#,c#,async-await,C#,Async Await,在花了太多时间尝试整理async/await hell之后,我们正在尝试获得一个标准,当我们必须在我们不控制的库上调用异步方法时,以及在没有提供非异步方法的情况下,我们一起从代码中获取异步 我不想讨论这种方法的优点,我相信对于某些人来说,async/Wait是可行的,它只是一种简单易行的方法,可以调用任何异步方法而不会出现死锁等 做 及 做这个工作?是否需要配置等待(false)?异常会正常工作吗?嗯,写作也是 也就是说,有一个问题。除非第三方库需要使用当前上下文,否则您建议的“线程池攻击”将起

在花了太多时间尝试整理async/await hell之后,我们正在尝试获得一个标准,当我们必须在我们不控制的库上调用异步方法时,以及在没有提供非异步方法的情况下,我们一起从代码中获取异步

我不想讨论这种方法的优点,我相信对于某些人来说,async/Wait是可行的,它只是一种简单易行的方法,可以调用任何异步方法而不会出现死锁等

做这个工作?是否需要配置等待(false)?异常会正常工作吗?

嗯,写作也是

也就是说,有一个问题。除非第三方库需要使用当前上下文,否则您建议的“线程池攻击”将起作用。例如,如果它是一个方法,希望在可以访问UI控件的场景中运行,或者如果它希望具有
HttpContext.Current
大多数库都不需要这个,所以这种方法对它们有用

在所有情况下,没有任何黑客可以在任何地方都有效

您不需要
配置等待(false)
。没有
等待
进行配置


对于异常,应该使用
GetAwaiter().GetResult()
而不是
Result
Wait()
。这可以防止异常被包装在
aggregateeexception

中,答案是没有异常。实际上,你所做的任何事情都会有潜在的问题。这就是为什么你首先不需要把自己放在那个位置上。如果有一个简单的万无一失的解决方案总是有效的,你就不会经常有人告诉你为什么你不应该这样做,因为没有必要了。@Servy好吧,我同意,我已经试着找到具有同步方法的替代库步骤,在多次重复这一点之后,我向你表示敬意,因为你仍然保持理智和高效:在我阅读你之前引用的链接之前,DI始终通过同步包装器是好的。可能救了我很多麻烦。很好的链接非常感谢brownfield async的那篇文章,非常好,因为我们几乎从不受IO和CPU的限制,我想这就是我们遇到问题的原因。很遗憾,这么多的.net都在强制异步/await@dibs487:
async
不适用于CPU绑定的代码;如果开发人员试图在不需要的地方使用
async
,就会导致问题
async
在I/O中工作得很好,但与CPU绑定的混合需要一些注意。我有一个博客系列,部分解决了这个问题。
public someObject SomeFunction(string parameter)
{
    return Task.Run(() => 3rdPartyLib.SomeFunctionAsync(parameter)).Result;
}
public void SomeMethod()
{
    return Task.Run(() => 3rdPartyLib.SomeMethodAsync()).Wait;
}