为什么存在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。
它的缺点是向后兼容。
进一步阅读:
对我来说,最引人注目的原因是当函数变成async
时, return
语句的含义发生变化。 没有asnyc
return x
意思是“返回一个任务的价值x
”,并与asynchronous它的意思是“任务的结果设置为x
。
前段时间,我在博客上写了关于asynchronous/等待关键字问题的总结 。
下面是“推断async
”一节的结论:
Eric Lippert在这个问题上有明确的职位 。 在博客评论 , Channel9和论坛中也有讨论。
总而言之,一个单词
await
关键字将会是一个突破性的变化。 select是在多个字之间等待(例如,await for
)或方法(async
)上的关键字,这将启用该方法中的await
关键字。 显式标记async
方法对于人类和计算机来说都更容易parsing,因此他们决定使用async/await
对。