C# 当您无法到达管道时,一路异步是否有意义?

C# 当您无法到达管道时,一路异步是否有意义?,c#,async-await,synchronous,C#,Async Await,Synchronous,有时您有一个组件,例如HttpClient,它只提供异步方法 如果您可以“一直到”一个异步事件处理程序或异步操作方法,那么这很好,因为据我所知,执行会返回到IIS管道,例如,它可以继续运行其他东西 当你不能“一路向上”时,你必须在某个时候做一些类似于.Result的事情 我的案例是一个承载WCF服务的windows服务,它使用HttpClient从API获取一些数据。我的代码在一个由接口绑定的方法中,该接口不能更改,更改也没有意义,因为应用程序已经直接管理线程,而不需要任务 在这种情况下,是否最

有时您有一个组件,例如
HttpClient
,它只提供异步方法

如果您可以“一直到”一个异步事件处理程序或异步操作方法,那么这很好,因为据我所知,执行会返回到IIS管道,例如,它可以继续运行其他东西

当你不能“一路向上”时,你必须在某个时候做一些类似于
.Result
的事情

我的案例是一个承载WCF服务的windows服务,它使用
HttpClient
从API获取一些数据。我的代码在一个由接口绑定的方法中,该接口不能更改,更改也没有意义,因为应用程序已经直接管理线程,而不需要任务


在这种情况下,是否最好尽可能地“一路向上”,最终直接阻止或阻止异步方法,并节省保存和恢复(等待)的复杂性和资源,一直到顶部,似乎没有任何理由?

如果阻止异步操作,很可能会出现死锁。检查此答案和问题的其他答案,以获得该主题的移动动机

在一般情况下,我建议使用


这是《C#中的异步》一书的作者写的一篇很棒的文章。

为什么你不能一直往上走呢?没有一个正确的答案,这取决于你的情况。因此,我投票决定结束这场辩论,主要是基于个人意见。请务必仔细阅读如何在同步方法中调用异步代码,因为
…Wait()
可能不是您想要的。在
任务中包装它是没有意义的。Run()
。它与
DoSomethingAsync().Wait()
减去线程相同。当你不能一直往上走的时候,你通常不需要。@bommelding
DoSomethingAsync()deadlock@Saruman-是的,但是
任务也是如此。运行(…).Wait()
。我的观点是,它们同样糟糕,也可能同样可以接受。“如果阻止异步操作,很可能会出现死锁。”不过,这取决于线程上下文的类型。@KennethK。确实如此,但是您想在控制台应用程序中编写不可移植的代码吗?根据经验,应该避免阻塞任务。任务的全部目的是避免阻塞。@spender您是否经常将控制台应用程序移植到ASP.NET应用程序?看,在服务或数据层中编写阻塞代码是个坏主意。但是如果你是在用户层,那么如果你改变前端,你很可能正在写这一点。@KennethK。同意,控制台应用程序和GUI/服务器应用程序之间的交叉可能很小,但是随着
async
现在在控制台应用程序中一路高居榜首(
publicstaticasync Task Main(string[]args){}
),阻塞的原因正在消失。感谢AsyncEx.Context。我去看看。