【问题标题】:Why does the async keyword exist为什么存在 async 关键字
【发布时间】:2012-02-10 09:46:28
【问题描述】:

浏览第 9 频道的 msdn 视频时,我发现了以下未答复的评论,希望有人能解释一下吗?

我不明白 async 关键字的意义。为什么不让 方法返回 Task 时的 await 关键字,就像迭代器一样 可以在任何返回 IEnumerable 的方法上产生返回。

我确信有充分的理由,我只是想了解为什么上述建议是不可能的。

【问题讨论】:

  • 我的蜘蛛侠感觉在发麻…… Jon Skeet 正在路上!在我们等待的同时,进一步阅读:blogs.msdn.com/b/ericlippert/archive/2010/10/29/…
  • 需要两个不同位置的关键字来实现一个新功能似乎是一个糟糕的设计选择。很多人问这个问题的事实意味着(对我来说)做出了错误的选择。通读博客中的所有推理,我可以遵循逻辑,但妥协并不总是最好的计划。有时最好打破一些代码并继续前进。
  • 我个人认为做出了最安全的选择。如果破坏代码和不破坏代码之间的所有只是一个简单的关键字,那么这并不是一项繁重的任务。人们可能会对此发表意见,但可以假设他们不会遇到向后兼容性问题。许多同意或不偏不倚的人都没有发声。
  • @Adelphus:那么,让我们使用科学。您可以创建自己的不使用 async 关键字的实现,我们将看到会引发多少问题。
  • 建议用编译器选项和 [EnableAwait(true|false)] 属性替换它:visualstudio.uservoice.com/forums/121579-visual-studio/…

标签: c# .net asynchronous async-ctp


【解决方案1】:

引入它主要是为了避免向后兼容性问题。如果一个方法的async-ness 必须由编译器推断(这将通过检测await 关键字),那么存在一些微妙的场景,即现有代码会突然被区别对待,特别是当你有标识符时(变量或函数名称称为 await)。

完整的解释在这里:https://docs.microsoft.com/en-us/archive/blogs/ericlippert/asynchrony-in-c-5-part-six-whither-async

【讨论】:

【解决方案2】:

我认为也许这篇文章涵盖了推理:

https://docs.microsoft.com/en-us/archive/blogs/ericlippert/asynchrony-in-c-5-part-six-whither-async

第一段说:

很多人问我是什么促使设计决策 要求任何包含“await”表达式的方法作为前缀 使用上下文关键字“async”。

结论是:

这有很多优点和缺点;在评估所有这些之后,并且 大量使用原型编译器来了解它的感觉, C# 设计者决定在一个方法上要求“异步” 包含一个“等待”。我认为这是一个合理的选择。

它的缺点是向后兼容。

进一步阅读:

http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence-await.aspx

【讨论】:

  • +1。引用 Eric Lippert 是 being Eric Lippert 的下一个最好的事情 :)
  • 我只想补充一点,我非常希望 C# 2 的设计者决定在每个打算成为迭代器的方法的开头放置“迭代器”或一些类似的关键字。在你知道它是否是一个迭代器块之前必须解析可能是整个方法体是非常令人烦恼的。
  • 更不用说它还允许匿名方法成为迭代器。
【解决方案3】:

对我来说,最令人信服的原因是当函数变为async 时,return 语句的含义会发生变化。没有asnyc return x 表示“返回值为x 的任务”,而使用异步则表示“将任务结果设置为x

【讨论】:

    【解决方案4】:

    不久前我在博客上写了summary of async/await keyword questions

    这是“推断async”部分的结论:

    Eric Lippert 有关于这个主题的definitive postblog commentsChannel9forums 也对此进行了讨论。

    总而言之,一个单词await 关键字将是一个太大的破坏性变化。选择是在多字等待(例如,await for)或方法上的关键字(async)之间,这将在该方法中启用await 关键字。显式标记方法 async 更容易被人和计算机解析,因此他们决定使用 async/await 对。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-13
      • 2016-11-14
      • 2019-11-14
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      相关资源
      最近更新 更多