Max*_*ich 79 c# continuations async-await async-ctp
请有人能够确认我是否正确理解了Async await关键字吗?(使用CTP的第3版)
到目前为止,我已经解决了在方法调用之前插入await关键字基本上做了两件事,A.它创建一个立即返回和B.它创建一个"延续",在完成异步方法调用时调用.在任何情况下,continuation都是该方法的代码块的其余部分.
所以我想知道的是,这两位代码在技术上是等价的,如果是这样,这基本上意味着await关键字与创建ContinueWith 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");
Run Code Online (Sandbox Code Playgroud)
VS
(new POP3Connector(
"mail.server.com", txtUsername.Text, txtPassword.Text ).Connect())
.ContinueWith((success) =>
MessageBox.Show(success.Result ? "Logged In" : "Wrong password"));
Run Code Online (Sandbox Code Playgroud)
Ste*_*ary 81
一般的想法是正确的 - 该方法的其余部分被制成各种各样的延续.
在"快速通道"的博客文章对如何详细信息async/ await编译器改造工作.
差异,脱离我的头脑:
该await关键字还使用"调度上下文"概念.调度上下文SynchronizationContext.Current是否存在,重新开始TaskScheduler.Current.然后在调度上下文上运行继续.因此,一个更接近于将传递TaskScheduler.FromCurrentSynchronizationContext到ContinueWith上回落TaskScheduler.Current,如果必要的.
实际async/ await实现基于模式匹配; 它使用"等待"模式,允许等待除任务之外的其他事物.一些例子是WinRT异步API,一些特殊的方法,如YieldRx observables,以及特殊的socket等待,它们没有像GC那样严重打击GC.任务是强大的,但他们不是唯一的等待.
还会想到一个小小的挑剔的区别:如果等待已经完成,那么该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/
| 归档时间: |
|
| 查看次数: |
19428 次 |
| 最近记录: |