为什么存在async关键字

本文关键字:关键字 async 存在 为什么 | 更新日期: 2023-09-27 18:23:56

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

我不明白async关键字的意思。为什么不允许只要方法返回Task,就可以使用wait关键字,就像迭代器一样可以对任何返回IEnumerable的方法产生回报。

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

为什么存在async关键字

引入它主要是为了避免向后兼容性问题。如果一个方法的async性质必须由编译器推断(即通过检测await关键字),那么在某些微妙的情况下,现有代码会突然被不同对待,尤其是当您有标识符(称为await的变量或函数名)时。

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

我认为这篇文章可能涵盖了推理:

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

第一段指出:

很多人问我是什么促使我做出设计决定要求任何包含";等待";要加前缀的表达式其中上下文关键字";异步";。

其结论是:

这有很多优点和缺点;在评估了所有这些之后,以及玩了很多原型编译器来看看它的感觉,C#设计者决定要求";异步;关于一种方法包含一个";等待";。我认为这是一个合理的选择。

简而言之就是向后兼容性。

进一步阅读:

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

对我来说,最令人信服的原因是当函数变成async时,return语句的含义会发生变化。如果没有asnycreturn x表示"返回值为x的任务",如果有async,则表示"将任务的结果设置为x

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

以下是";推断CCD_ 10":

埃里克·利珀特在这个问题上具有权威性。博客评论、频道9和论坛也讨论过这一点。

总之,一个单词await关键字的突破性变化太大了。选择是在多字等待(例如,await for)或方法上的关键字(async)之间,该关键字将在该方法内启用await关键字。显式标记方法async对人类和计算机来说都更容易解析,所以他们决定使用async/await对。