【问题标题】:Does GetAwaiter() throw a single exception? [duplicate]GetAwaiter() 会抛出一个异常吗? [复制]
【发布时间】:2020-02-24 14:06:17
【问题描述】:

我试图理解为什么会使用以下Task.RunGetAwaiter().GetResult() 而不是await ... <result>

(var success, var response) = Task.Run(() => HTTPHelper.SendRequest<SomeJsonResponse>( ... )).GetAwaiter().GetResult();

上面的代码是否抛出this article showsException 而不是AggregateException?如果是这样,我相信这就是选择这种结构的原因。

在这种情况下是否可以使用async ... await 并获得相同的结果? (我认为不会,如果只有上面的代码才能满足单一异常要求。)

【问题讨论】:

  • "而不是 await ... .Result" - 你永远不会将 .Resultawait 一起使用。它只是行不通。 await 关键字为您解开结果。
  • 微软关于异步编程的文章其实写得很好。您可能会从阅读它们中受益。从这里开始:Asynchronous programming with async and await

标签: c# .net async-await


【解决方案1】:

是的,您可以并且应该使用async await

(var success, var response) = await HTTPHelper.SendRequest<SomeJsonResponse>( ... )

那么就不需要把它包装到Task中了。我假设.SendRequest&lt;SomeJsonResponse&gt;() 返回Task

仅供参考:.Wait().ResultGetAwaiter().GetResult() 都是线程阻塞执行

【讨论】:

  • 我觉得这很有趣:stackoverflow.com/a/38530225/71376
  • 实际上,在回答您的问题时,我相信.SendRequest 不会返回任务,部分原因是它是一种遗留方法,因此Task.Run()
  • @MattW 是的,如果您无法更改方法签名以返回任务,这基本上是一种解决方法
  • 谢谢 :) 看起来关于这个话题有很多不同的意见(或者至少是历史)。甚至标记为该副本原件的帖子似乎也从两个不同的方向声称答案(好吧,无论如何,回复都是如此。)
  • @MattW 每个人都同意,如果可以的话,你应该使用await。分歧仅在于如何同步等待异步方法(您应该首先努力避免这样做)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多