为什么async关键字存在

Max*_*ich 39 .net c# asynchronous async-ctp

浏览频道9 msdn视频我发现以下未答复的评论,希望有人可以解释一下吗?

我不明白async关键字.为什么不在方法返回Task时随时允许await关键字,就像迭代器可以在任何返回IEnumerable的方法上产生返回一样.

我确信有充分的理由,我只是想明白为什么上述建议是不可能的.

jer*_*enh 21

它的引入主要是为了避免向后兼容性问题.如果async方法的-ness必须由编译器推断(通过检测await关键字),那么有一些微妙的场景会突然对现有代码进行不同的处理,特别是当您有标识符(称为变量或函数名称await)时.

完整的解释如下:http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx

  • 网址接缝断了?我认为这就是所提到的:https://docs.microsoft.com/en-us/archive/blogs/ericlippert/asynchrony-in-c-5-part-six-whither-async (2认同)

Ada*_*rth 15

我想也许这篇文章涵盖了推理:

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

  • 我想补充一点,我非常希望C#2设计者决定在每个想要成为迭代器的方法的开头放置"iterator"或类似的关键字.在知道它是否是迭代器块之前,必须先解析*整个方法体*是非常令人烦恼的. (8认同)
  • +1.引用Eric Lippert是下一个最好的事情**Lip Lippert :) (4认同)

Cod*_*aos 9

对我来说,最令人信服的理由是,return当一个函数成为时,语句的含义会发生变化async.没有asnyc return x意味着"返回具有值的任务x",并且使用异步意味着"将任务的结果设置为" x.