为什么存在async关键字
通过频道浏览9个msdn视频我发现了以下未答复的评论,并希望有人可以解释它?
我没有得到异步关键字的重点。 为什么不在方法返回Task时只允许await关键字,就像迭代器可以返回任何返回IEnumerable的方法的返回值一样。
我确信有一个很好的理由,我只想明白为什么上述建议不可行。
它主要是为了避免向后兼容性问题而引入的。 如果编译器必须推断方法的async
(即通过检测await
关键字),那么存在一些细微的场景,其中现有代码突然被区别对待,特别是当您有标识符(变量或函数名称叫await
)。
完整的解释在这里:http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx
我想也许这篇文章涵盖了推理:
http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx
第一段指出:
许多人问我是什么促使设计决定要求任何包含“await”表达式的方法以上下文关键字“async”为前缀。
它得出结论:
这是很多优点和缺点; 在评估了所有这些特性之后,以及大量玩弄原型编译器以了解其感受如何,C#设计师决定对包含“await”的方法要求“异步”。 我认为这是一个合理的选择。
它的缺点是向后兼容。
进一步阅读:
http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence-await.aspx
对我来说,最引人注目的原因是,当函数变成async
时, return
语句的含义会发生变化。 没有asnyc
return x
表示“返回一个带有值x
的任务”,而async意味着“将任务的结果设置为x
。