为什么存在async关键字

通过频道浏览9 msdnvideo我发现了以下未答复的评论,并希望有人可以解释它?

我没有得到asynchronous关键字的重点。 为什么不只是在方法返回Task时只允许await关键字,就像迭代器可以返回任何返回IEnumerable的方法一样。

我相信有一个很好的理由,我只想明白为什么上述build议是不可能的。

它主要是为了避免向后兼容性问题而引入的。 如果方法的async必须由编译器推断出来(这可以通过检测await关键字来实现),那么现有的代码会突然被区别对待,特别是当你有标识符(variables或函数名叫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

第一段指出:

许多人问我是什么促使devise决定要求包含“await”expression式的任何方法以上下文关键字“async”为前缀。

它得出结论:

这是一个很大的利弊; 在对所有这些方法进行了评估之后,还有很多人围绕着原型编译器来了解它的感受,C#devise人员决定对包含“await”的方法进行“asynchronous”处理。 我认为这是一个合理的select。

它的缺点是向后兼容。

进一步阅读:

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 ”,并与asynchronous它的意思是“任务的结果设置为x

前段时间,我在博客上写了关于asynchronous/等待关键字问题的总结 。

下面是“推断async ”一节的结论:

Eric Lippert在这个问题上有明确的职位 。 在博客评论 , Channel9和论坛中也有讨论。

总而言之,一个单词await关键字将会是一个突破性的变化。 select是在多个字之间等待(例如, await for )或方法( async )上的关键字,这将启用该方法中的await关键字。 显式标记async方法对于人类和计算机来说都更容易parsing,因此他们决定使用async/await对。