【发布时间】:2015-08-12 00:37:46
【问题描述】:
我喜欢新的 System.Net.Http.HttpClient 类。它有一个不错的简单 API,不会引发正常错误。但它只是异步的。
我需要可以运行的代码(在服务器内部)
foo();
bar();
// compute stuff
var x = GetThingFromOtherServerViaHttp();
// compute more stuff
wiz(x);
经典的顺序同步代码。我看到了几个类似的 SO 问题,但实际上从未最终说“这样做”。我看了
client.PostAsync.Wait()
全世界都在尖叫“不要这样做”。怎么样:
client.PostAsync.Result()
这不就是变相等待吗?
最后,我最终传入了一个处理结果的 lambda 回调,然后唤醒了显式等待 EventWaitHandle 的调用线程。很多管道。有没有更简单的东西,或者我应该回到使用旧的 http 客户端
编辑:进一步阅读后,我怀疑这段代码与等待和结果有相同的问题,它只是一个更冗长的死锁
编辑:我让 MS PM 最近向我确认,有一项要求“任何可能需要 > X ms(我忘了 X)的 API 必须是异步的”,许多 PM 将其解释为“仅异步”(不清楚是否这是预期的)。因此 Document DB api 只是异步的。
【问题讨论】:
-
使用
Result即可,例如:stackoverflow.com/a/14435574/1663001 -
不是。结果只是。变相等待?有什么不同。链接的 SO 有同样的问题,链接到文章说“不要这样做”
-
但是。我注意到
HttpClient不是.net 4.0 类。这是一个 .net 4.5 类。这意味着您可以访问异步等待。那你为什么不用它呢? -
@pm100:为什么不使用
WebClient? -
@ToddMenier 我在我的问题中说过,我喜欢 HttpClient 的一些功能,这是其他客户端没有提供的。特别是它不会抛出。我一直担心 MS 会开始制作仅异步的新功能,但由于许多原因,许多应用程序在任何地方都不是异步的 - 这是一种情况