.net 为什么存在async关键字

svgewumm  于 2023-08-08  发布在  .NET
关注(0)|答案(4)|浏览(116)

浏览9频道的msdn视频时,我发现了以下未回复的评论,并希望有人能解释一下?
我不明白async关键字的意义。为什么不允许在方法返回Task的任何时候使用await关键字,就像迭代器可以在任何返回IEnumerable的方法上返回一样。
我相信有一个很好的理由,我只是想了解为什么上述建议是不可能的。

jmp7cifd

jmp7cifd1#

它的引入主要是为了避免向后兼容性问题。如果一个方法的async-ness必须由编译器推断(这将是通过检测await关键字),那么就会有一些微妙的情况,即现有代码会突然被不同地对待,特别是当你有标识符(变量或函数名称为await)时。
完整的解释在这里:https://learn.microsoft.com/en-us/archive/blogs/ericlippert/asynchrony-in-c-5-part-six-whither-async

yqlxgs2m

yqlxgs2m2#

我想这篇文章可能涵盖了推理:
https://learn.microsoft.com/en-us/archive/blogs/ericlippert/asynchrony-in-c-5-part-six-whither-async
第一段规定:
很多人问我,是什么促使设计决策要求任何包含“await”表达式的方法都以上下文关键字“async”为前缀。
报告的结论是:
这是一大堆利弊在评估了所有这些方法之后,并对原型编译器进行了大量的测试,以了解它的感受,C#设计者决定在包含“await”的方法上要求“async”。我认为这是一个合理的选择。
简单来说就是向后兼容性。
进一步阅读:
https://learn.microsoft.com/en-us/archive/blogs/ericlippert/asynchrony-in-c-5-part-one

5n0oy7gb

5n0oy7gb3#

对我来说,最令人信服的原因是,当一个函数变成async时,return语句的含义发生了变化。如果没有asnycreturn x意味着“返回一个值为x的任务”,如果有async,则意味着“将任务的结果设置为x”。

sg24os4d

sg24os4d4#

我写了一个summary of async/await keyword questions在我的博客一段时间前。
下面是“推断async“一节的结论:
埃里克·利珀特(Eric Lippert)在这个问题上有definitive post。在blog commentsChannel9forums中也讨论过。
总而言之,一个单词await关键字将是一个太大的突破性变化。选择是在多字await(例如,await for)或方法上的关键字(async)之间进行,该方法将在该方法中启用await关键字。显式地标记方法async对于人类和计算机来说都更容易解析,所以他们决定使用async/await对。

相关问题