GMTC 全球大前端技术大会 8 折涨价倒计时 2 天,现在购票立减 ¥960 ! 了解详情
写点什么

一切皆可等待

2013 年 1 月 14 日

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 )关注我们,并与我们的编辑和其他读者朋友交流。

2013 年 1 月 14 日 05:07766
用户头像

发布了 59 篇内容, 共 18.7 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

我决定输出一篇文章用于记录一个足足花了四小时才找到的BUG

LSJ

Java spring aop ProxyFactory proxyTargetClass

技术干货 | mPaaS 小程序高玩带你起飞:客户端预置小程序无视网络质量

蚂蚁集团移动开发平台 mPaaS

小程序 网络环境 mPaaS

如何通过事务消息保障抢购业务的分布式一致性?

阿里巴巴中间件

阿里云 云原生 电商 消息队列 分布式柔性事务‘’

正月十五吃汤圆CountDownLatch

叫练

AQS join 共享锁 CountDownLatch 多线程高并发

Kafka 中所谓的 ‘零拷贝’ 技术到底是什么?

码农架构

Java kafka 程序员 架构 微服务

用 Selenium 搞定自动化测试项目,途牛搜机票。

梦想橡皮擦

28天写作 2月春节不断更

聊聊前端日志库在SaaS产品中的应用与设计

元三

前端 SaaS

常见加密方式及Python实现

行者AI

加密

写给管理者的睡前故事

每天读本书

读书笔记 每天读本书

单例设计模式

桃子

MyCat集成MySQL完成数据库集群建设

831143

Java MySQL mycat

android开发视频教程!移动开发者升职加薪的8项技能,成功定级腾讯T3-2

欢喜学安卓

android 程序员 面试 移动开发

DBS

陈皓07

荟聚·沉淀——百度大脑AI开放平台的2020年

百度大脑

【得物技术】Web Components 初探

得物技术

Web API 得物技术 Web Component 组件

区块链与数字货币的发展到底有什么意义

CECBC区块链专委会

金融

android开源!字节跳动Android岗经典面试真题,含泪整理面经

欢喜学安卓

android 程序员 面试 移动开发

中核携手北京天源迪科完成电子商城二期项目,开创集团数字化采购新局面

DT极客

我看JAVA 之 AbstractStringBuilder & StringBuffer & StringBuilder

awen

Java 源码 jdk string

数字化转型提速,DataPipeline助力中石油产业大数据实时共享能力再提升

DataPipeline

数据融合

341 万考生,除了图书馆他们去了这样一个地方

IoT云工坊

小程序 人工智能 物联网 云平台 24小时无人自习室

android开发视频!Android程序员最大的悲哀是什么?面试真题解析

欢喜学安卓

android 程序员 面试 移动开发

LeetCode题解:120. 三角形最小路径和,动态规划(从上到下),JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

元宵 | TcaplusDB君邀您来猜灯谜!

TcaplusDB

数据库 TcaplusDB Tcaplus

区块链打造“红娘链”,婚姻上链让爱更“牢固”

CECBC区块链专委会

婚姻

MySQL COUNT(列名) 、COUNT(常量) 和 COUNT(*) 之间的区别

桃子

买基金赔掉一条裤衩之后,我又回来更文了

Java_若依框架教程

投资 理财 基金 茅台

话题讨论 | 国产GPU公司连续融资,春天已来?元芳你怎么看?

程序员架构进阶

话题讨论 七日更 28天写作 2月春节不断更 话题王者

架构设计篇之微服务实战笔记(七)

小诚信驿站

架构师 刘晓成 小诚信驿站 28天写作 架构师成长笔记

Aspose word 转换为pdf 排版错位和数据丢失

blues199

Java Apache POI

区块链能否一劳永逸地结束痛苦的选票争端?

CECBC区块链专委会

区块链

一切皆可等待-InfoQ