为了账号安全,请及时绑定邮箱和手机立即绑定

Async await关键字是否等同于ContinueWith lambda?

Async await关键字是否等同于ContinueWith lambda?

C#
开满天机 2019-12-26 10:15:16
有人可以请我确认我是否正确理解Async await关键字吗?(使用CTP版本3)到目前为止,我已经得出结论,在方法调用之前插入await关键字实际上可以完成两件事:A。它创建立即返回,B。它创建“继续”,在异步方法调用完成时调用。无论如何,继续是该方法的代码块的其余部分。因此,我想知道的是,这两段代码在技术上是否等效,如果是,这是否基本上意味着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");VS(new POP3Connector(    "mail.server.com", txtUsername.Text, txtPassword.Text ).Connect()).ContinueWith((success) =>    MessageBox.Show(success.Result ? "Logged In" : "Wrong password"));
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

总体思路是正确的-该方法的其余部分被制成各种形式的延续。


在“快速通道”的博客文章有如何的细节async/ await编译器改造工程。


差异,浮现在脑海:


该await关键字还使用“调度环境”的概念。调度上下文是(SynchronizationContext.Current如果存在的话),返回TaskScheduler.Current。然后,继续在调度上下文上运行。因此,如果需要的话,可以更近似地传递TaskScheduler.FromCurrentSynchronizationContext给ContinueWith,然后再回落TaskScheduler.Current。


实际async/ await实现基于模式匹配;它使用“等待”模式,该模式允许等待任务以外的其他事情。例如WinRT异步API,某些特殊方法(例如YieldRx observables和特殊套接字可等待),它们对GC的影响不那么严重。任务功能强大,但并不是唯一可以等待的任务。


还有一点细微的挑剔的区别:如果等待已完成,则该async方法实际上不会在此时返回;它同步地继续。因此,这有点像传递TaskContinuationOptions.ExecuteSynchronously,但是没有与堆栈相关的问题。


查看完整回答
反对 回复 2019-12-26
?
PIPIONE

TA贡献1829条经验 获得超9个赞

异步/等待比ContinueWith(...)更具表现力的另一个例子是异常的流动。您可以在同一个try块中等待多次,对于执行的每个阶段,可以将它们的异常集中到同一catch(...)块中,而不必编写大量的代码来明确地执行此操作。

查看完整回答
反对 回复 2019-12-26
  • 3 回答
  • 0 关注
  • 255 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信