为什么存在 async 关键字

Why does the async keyword exist

提问人:Maxim Gershkovich 提问时间:2/10/2012 最后编辑:Maxim Gershkovich 更新时间:7/26/2023 访问量:3836

问:

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

我不明白 async 关键字的意义。为什么不直接允许 await 关键字,只要该方法返回 Task,就像迭代器一样 可以在返回 IEnumerable 的任何方法上生成 Return。

我相信有一个很好的理由,我只是想了解为什么上述建议是不可能的。

C# .NET 步 CTP

评论

9赞 Adam Houldsworth 2/10/2012
我的蜘蛛感很刺痛......乔恩·斯基特(Jon Skeet)正在路上!当我们都在等待时,进一步阅读:blogs.msdn.com/b/ericlippert/archive/2010/10/29/......
1赞 adelphus 2/10/2012
需要在不同的位置使用两个关键字来实现一个新功能似乎是一个糟糕的设计选择。事实上,很多人都在问这个问题,这意味着(对我来说)做出了错误的选择。通读博客中的所有推理,我可以遵循逻辑,但妥协并不总是最好的计划。有时最好打破一些代码并继续前进。
1赞 Adam Houldsworth 2/10/2012
我个人认为做出了最安全的选择。如果在破解代码和不破解代码之间所包含的只是一个简单的关键字,那么这并不是一项过于繁重的任务。人们可能会对此直言不讳,但可以假设他们不会遇到向后兼容性问题。许多同意或公正的人没有发声。
4赞 Eric Lippert 2/11/2012
@Adelphus:那么,让我们用科学。您创建自己的不使用 async 关键字的实现,我们将看到这引发了多少问题。
0赞 artelk 11/12/2014
建议将其替换为编译器选项和 [EnableAwait(true|false)] 属性:visualstudio.uservoice.com/forums/121579-visual-studio/...

答:

15赞 Adam Houldsworth 2/10/2012 #1

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

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

第一段指出:

很多人问我,是什么促使我做出设计决定 要求任何包含“await”表达式的方法都带有前缀 替换为 contextual 关键字“async”。

它的结论是:

这有很多优点和缺点;在评估了所有这些之后,以及 大量尝试原型编译器,看看它的感觉如何, C# 设计者决定要求在一种方法上“异步”,该方法 包含“await”。我认为这是一个合理的选择。

它的缺点是向后兼容性。

延伸阅读:

https://learn.microsoft.com/en-us/archive/blogs/ericlippert/asynchrony-in-c-5-part-one

评论

4赞 Benjol 2/10/2012
+1.引用埃里克·利珀特(Eric Lippert)是仅次于埃里克·利珀特(Eric Lippert)的第二件好事:)
9赞 Eric Lippert 2/11/2012
我只想补充一点,我非常希望 C# 2 设计人员决定将“迭代器”或一些类似的关键字放在每个旨在成为迭代器的方法的开头。在知道它是否是迭代器块之前,必须解析整个方法体,这是非常令人烦恼的。
1赞 Dax Fohl 8/7/2012
更不用说它也允许匿名方法成为迭代器。
0赞 Elroy Flynn 7/19/2023
上面的埃里克·利珀特(Eric Lippert)博客的链接已损坏。该系列帖子中第一个的新位置是 learn.microsoft.com/en-us/archive/blogs/ericlippert/...
0赞 Adam Houldsworth 7/26/2023
@ElroyFlynn 感谢您的捕获,我已经用您的链接更新了帖子:-)
25赞 jeroenh 2/10/2012 #2

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

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

评论

2赞 Yodiz 2/19/2020
Url接缝坏了?我认为这个就是被指的那个:learn.microsoft.com/en-us/archive/blogs/ericlippert/......
11赞 CodesInChaos 2/10/2012 #3

对我来说,最令人信服的原因是,当一个函数变为 .Without 表示“返回一个值为 ”的任务,而 async 表示“将任务的结果设置为 。returnasyncasnycreturn xxx

3赞 Stephen Cleary 2/10/2012 #4

不久前,我在我的博客上写了一篇关于 async/await 关键字问题的摘要

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

埃里克·利珀特 (Eric Lippert) 有关于该主题的权威文章博客评论Channel9论坛中也对此进行了讨论。

总而言之,一个单字关键词的重大变化太大了。选择是多词 await(例如,)或方法上的关键字 (),该关键字将在该方法中启用关键字。显式标记方法对人类和计算机来说都更容易解析,因此他们决定使用这对方法。awaitawait forasyncawaitasyncasync/await