浏览频道9 msdn videos我发现了以下未答复的评论,希望有人可以解释一下吗?
我不明白async关键字。为什么不允许 当方法返回Task时,await关键字就像迭代器一样 可以在任何返回IEnumerable的方法上产生返回。
我确信有充分的理由,我只想理解上述建议无法实现的原因。
答案 0 :(得分:21)
它的引入主要是为了避免向后兼容性问题。如果方法的async
- 必须由编译器推断(通过检测await
关键字),那么有一些微妙的场景会突然对现有代码进行不同的处理,特别是当你有标识符(变量或函数名称为await
)。
这里有完整的解释:http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx
答案 1 :(得分:15)
我想也许这篇文章涵盖了推理:
http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx
第一段陈述:
许多人问我设计决策的动机是什么 要求任何包含“await”表达式的方法都要加前缀 使用上下文关键字“async”。
总结如下:
这有很多优点和缺点;在评估了所有这些之后,和 很多人玩原型编译器来看看它的感受, C#设计者决定在一个方法上要求“异步” 包含“等待”。我认为这是一个合理的选择。
缺点是向后兼容性。
进一步阅读:
答案 2 :(得分:9)
对我而言,最令人信服的理由是,当函数变为return
时,async
语句的含义会发生变化。没有asnyc
return x
表示“返回值为x
的任务”,而使用异步则表示“将任务结果设置为x
。
答案 3 :(得分:2)
我刚才在博客上写了summary of async/await keyword questions。
以下是“推断async
”部分的结论:
Eric Lippert关于此主题有definitive post。它也在blog comments,Channel9和forums中进行了讨论。
总而言之,单词
await
关键字太大而不会发生突破性变化。选择是在多字等待(例如,await for
)或方法(async
)上的关键字之间选择,该关键字将在该方法中启用await
关键字。明确标记方法async
对于人类和计算机来说都更容易解析,因此他们决定使用async/await
对。