浏览9频道的msdn视频时,我发现了以下未回复的评论,并希望有人能解释一下?我不明白async关键字的意义。为什么不允许在方法返回Task的任何时候使用await关键字,就像迭代器可以在任何返回IEnumerable的方法上返回一样。我相信有一个很好的理由,我只是想了解为什么上述建议是不可能的。
jmp7cifd1#
它的引入主要是为了避免向后兼容性问题。如果一个方法的async-ness必须由编译器推断(这将是通过检测await关键字),那么就会有一些微妙的情况,即现有代码会突然被不同地对待,特别是当你有标识符(变量或函数名称为await)时。完整的解释在这里:https://learn.microsoft.com/en-us/archive/blogs/ericlippert/asynchrony-in-c-5-part-six-whither-async
async
await
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的
5n0oy7gb3#
对我来说,最令人信服的原因是,当一个函数变成async时,return语句的含义发生了变化。如果没有asnyc,return x意味着“返回一个值为x的任务”,如果有async,则意味着“将任务的结果设置为x”。
return
asnyc
return x
x
sg24os4d4#
我写了一个summary of async/await keyword questions在我的博客一段时间前。下面是“推断async“一节的结论:埃里克·利珀特(Eric Lippert)在这个问题上有definitive post。在blog comments、Channel9和forums中也讨论过。总而言之,一个单词await关键字将是一个太大的突破性变化。选择是在多字await(例如,await for)或方法上的关键字(async)之间进行,该方法将在该方法中启用await关键字。显式地标记方法async对于人类和计算机来说都更容易解析,所以他们决定使用async/await对。
await for
async/await
4条答案
按热度按时间jmp7cifd1#
它的引入主要是为了避免向后兼容性问题。如果一个方法的
async
-ness必须由编译器推断(这将是通过检测await
关键字),那么就会有一些微妙的情况,即现有代码会突然被不同地对待,特别是当你有标识符(变量或函数名称为await
)时。完整的解释在这里:https://learn.microsoft.com/en-us/archive/blogs/ericlippert/asynchrony-in-c-5-part-six-whither-async
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的
5n0oy7gb3#
对我来说,最令人信服的原因是,当一个函数变成
async
时,return
语句的含义发生了变化。如果没有asnyc
,return x
意味着“返回一个值为x
的任务”,如果有async,则意味着“将任务的结果设置为x
”。sg24os4d4#
我写了一个summary of async/await keyword questions在我的博客一段时间前。
下面是“推断
async
“一节的结论:埃里克·利珀特(Eric Lippert)在这个问题上有definitive post。在blog comments、Channel9和forums中也讨论过。
总而言之,一个单词
await
关键字将是一个太大的突破性变化。选择是在多字await(例如,await for
)或方法上的关键字(async
)之间进行,该方法将在该方法中启用await
关键字。显式地标记方法async
对于人类和计算机来说都更容易解析,所以他们决定使用async/await
对。