访问异步调用的结果是否会使它同步?

失去埃斯塔奎尔

我正在处理Http调用。

收到响应(HttpResponseMessage)后,我想以字符串形式访问其内容:

string responseContent = responseMessage.Content.ReadAsStringAsync().Result;

现在,ReadAsStringAsync()是异步的,但访问Result绝对应该是同步的。

我测试了代码,不确定以下内容:

  • 这将始终有效吗?,
  • 为什么行得通?
  • 尝试访问时应该不会出现异常Result
约翰

这个文档很容易回答

访问属性的get访问器会阻塞调用线程,直到异步操作完成为止它等效于调用Wait方法。

一旦操作结果可用,它将被存储并在随后对Result属性的调用中立即返回。请注意,如果在任务操作期间发生异常,或者任务已被取消,则Result属性不会返回值。相反,尝试访问属性值将引发AggregateException异常。

(强调我的)

直接回答您的问题;

  • 这会一直有效吗?-是的,在可能的情况下,除非任务失败或被取消。
  • 为什么行得通?-因为代码在返回结果之前等待任务完成。
  • 尝试访问Result时是否应该不会出现异常?-不,因为它不是简单的属性。docs指出,如果任务失败或被取消,您可能会获得异常。

正如@Camilo Terevinto所指出的那样,根据您所使用的上下文,这可能并不总是您所愿可能导致死锁。

原因是,如果您在存在上下文(例如UI上下文,ASP.NET请求上下文等)的情况下使用它,则其调用的内部机制.Wait()可能导致死锁:它正在等待一个好时机将结果插入到当前上下文中,同时当前上下文正在阻塞以等待结果。您可能想看看Stephen Cleary的博客您可以向下滚动到“导致死锁的原因”以了解更多信息。您也可以看看这个问题

当然,理想的解决方案是在整个链中适当地使用async / await。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章