BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

一切皆可等待

| 作者 Jonathan Allen 关注 530 他的粉丝 ,译者 姚琪琳 关注 0 他的粉丝 发布于 2013年1月15日. 估计阅读时间: 3 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

Lucian Wischik发布了一系列博客文章,阐述了如何在各种情况下(从等待动画完成到捕获命令行程序的输出结果)使用Await。

如何等待Storyboard”这篇文章包含了基本的模式。其核心为TaskCompletionSource。当Storyboard的Completed事件被触发时,附加的事件处理程序使用TaskCompletionSource将结果传递给Task。

这样我们就可以使用“Await storyboard1.PlayAsync()”这样的语法了。如果想再短点儿,只是使用“Await storyboard1”,可以构建一个扩展方法GetAwaiter,并让它返回一个TaskAwaiter。编译器会查找具有该名称的方法,并重写相关的代码。

要想看看更复杂的基于事件处理程序方法的示例,可以看看“如何等待MediaElement”。在这篇文章中作者创建了两个函数,OpenAsync和PlayAsync,并讨论了如何以干净的方式支持错误处理。

Lucian的RunCommandLineAsync支持从命令行程序中读取标准输出流和标准错误流。由于与这两种流以及输入流的交互问题,要实现这一点并不像看上去那么容易。Lucian解释了如何将多任务应用与此:

让“RedirectStandardInput/Output/Error”工作的精确方式取决于我们正在启动的进程的内部细节。我们能够确定的是,(1)在关闭StandardInput之前,进程可能还没完成;(2)在可以向StandardInput写数据之前,可能需要从StandardOutput/StandardError读取数据;(3)在可以从StandardOutput/StandardError读取更多的数据之前,可能需要向StandardInput写入更多的数据。这些约束意味着必须同时启动“tin/tout/terr”这三个任务,并用Task.WhenAll()来等待。

要了解Await和GetAwaiter如何在编译器中交互,请阅读Stephen Toub的文章“等待一切”。

查看英文原文How to Await Just About Anything


感谢杨赛对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT