为什么async关键字存在

时间:2012-02-10 09:46:28

标签: c# .net asynchronous async-ctp

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

  

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

我确信有充分的理由,我只想理解上述建议无法实现的原因。

4 个答案:

答案 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#设计者决定在一个方法上要求“异步”   包含“等待”。我认为这是一个合理的选择。

缺点是向后兼容性。

进一步阅读:

http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence-await.aspx

答案 2 :(得分:9)

对我而言,最令人信服的理由是,当函数变为return时,async语句的含义会发生变化。没有asnyc return x表示“返回值为x的任务”,而使用异步则表示“将任务结果设置为x

答案 3 :(得分:2)

我刚才在博客上写了summary of async/await keyword questions

以下是“推断async”部分的结论:

  

Eric Lippert关于此主题有definitive post。它也在blog commentsChannel9forums中进行了讨论。

     

总而言之,单词await关键字太大而不会发生突破性变化。选择是在多字等待(例如,await for)或方法(async)上的关键字之间选择,该关键字将在该方法中启用await关键字。明确标记方法async对于人类和计算机来说都更容易解析,因此他们决定使用async/await对。