asynchronous是否等待关键字相当于一个ContinueWith lambda?

有人可以请客气,以确认我是否已经正确理解Async等待关键字? (使用CTP版本3)

到目前为止,我已经计算出,在方法调用之前插入await关键字本质上是做了两件事情,它创build了一个立即返回和B.它创build了一个“继续”,在完成asynchronous方法调用时被调用。 在任何情况下,延续是该方法的代码块的其余部分。

所以我想知道的是,这两个代码在技术上是否等价,如果是这样,这基本上是否意味着await关键字与创buildContinueWith Lambda(即:它基本上是一个编译器快捷方式)相同? 如果不是,有什么区别?

bool Success = await new POP3Connector( "mail.server.com", txtUsername.Text, txtPassword.Text).Connect(); // At this point the method will return and following code will // only be invoked when the operation is complete(?) MessageBox.Show(Success ? "Logged In" : "Wrong password"); 

VS

 (new POP3Connector( "mail.server.com", txtUsername.Text, txtPassword.Text ).Connect()) .ContinueWith((success) => MessageBox.Show(success.Result ? "Logged In" : "Wrong password")); 

总体思路是正确的 – 方法的其余部分被做成各种各样的延续。

“快速path”博客文章详细介绍了async / await编译器转换的工作原理。

不同的是,我的头顶上:

await关键字也使用“调度上下文”的概念。 调度上下文是SynchronizationContext.Current如果存在),返回到TaskScheduler.Current 。 然后继续在调度上下文中运行。 所以更近似的方法是将TaskScheduler.FromCurrentSynchronizationContext传递到ContinueWith ,如有必要,返回TaskScheduler.Current

实际的async / await实现基于模式匹配; 它使用“等待”模式,允许等待除了任务之外的其他事情。 一些例子是WinRT的asynchronousAPI,一些特殊的方法,如Yield ,Rx observables和特殊套接字awaitables,它们不会像GC那样命中GC 。 任务是强大的,但他们不是唯一的候选人。

想到另一个微小的挑剔的区别:如果awaitable已经完成,那么async方法实际上不会在那个时候返回; 它继续同步。 所以这有点像传递TaskContinuationOptions.ExecuteSynchronously ,但没有堆栈相关的问题。

这是“本质上”的,但生成的代码不仅仅是这些。 有关代码生成的更多细节,我强烈推荐Jon Skeet的Eduasync系列:

http://codeblog.jonskeet.uk/category/eduasync/

特别是,#7后进入生成(为CTP 2),为什么,所以可能非常适合你目前的需求:

http://codeblog.jonskeet.uk/2011/05/20/eduasync-part-7-generated-code-from-a-simple-async-method/

编辑:我认为这可能是比你想要从问题更多的细节,但如果你想知道什么样的东西看起来像当你有多个等待在方法中,这是涵盖在后#9 🙂

http://codeblog.jonskeet.uk/2011/05/30/eduasync-part-9-generated-code-for-multiple-awaits/