一切皆可等待

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:07 695
用户头像

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

关注

评论

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

一个虚拟世界里栽树的公司及其启示

郭华

技术 商业模式 电影

面试官:你说你懂i++跟++i的区别,那你知道下面这段代码的运行结果吗?

程序员DMZ

JVM i++

区块链、人工智能……警惕非法金融借创新概念迷惑投资人

CECBC区块链专委会

区块链 金融

为啥PHP in_array(0,['a', 'b', 'c']) 返回为true?

架构精进之路

php 弱类型语言

易观郭炜:流动水系数造未来

易观大数据

程序范式的意义

soolaugust

架构 程序设计

实践案例丨教你一键构建部署发布前端和Node.js服务

华为云开发者社区

node.js 后端 服务器 代码 华为云鲲鹏

MySQL关于日期为零值的处理

Simon

MySQL

CRM往事丨三件事,所有SaaS的缩影

人称T客

跨域问题(CORS / Access-Control-Allow-Origin)

xcbeyond

Java CORS 跨域

MySQL索引问题探究手记

架构精进之路

MySQL 索引

关于日期及时间字段的查询

Simon

MySQL sql查询

草脸识别,AI泡沫还是皇冠明珠?

郭华

人工智能 AI 商业 解决方案

ARTS week 4

锈蠢刀

一个数据库管理员的自我救赎之路

华为云开发者社区

数据库 华为云 数据库迁移 企业上云 DRS

面试必杀技,讲一讲Spring中的循环依赖

程序员DMZ

spring

操作系统bochs安装及使用

allworldg

操作系统

SWARM学习1——Kademlia分布式路由表协议

AIbot

区块链 DHT 分布式存储 分布式文件存储 分布式路由

如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章

程序员DMZ

spring 生命周期

学习的深度 & 深度的学习

北风

学习 学习法

nginx 报错 accept4 () failed (24:Too many open files)

Java联盟

nginx

云上安全工作乱如麻,等保2.0来一下

华为云开发者社区

安全 华为云 等保 云平台 多云服务

SpringCloud服务注册中心双节点集群(Eureka集群)

xcbeyond

Java 架构 微服务 Eureka 集群

Java-技术专题-synchronized关键字

李博@Alex

海量并发也没那么可怕,运维准点下班全靠它!

华为云开发者社区

容器 网络 并发 华为云 裸金属容器

恢复青春气息,就靠这套人像美肤算法了

博文视点Broadview

算法 计算机视觉 图像识别 人像

影响音视频延迟的关键因素(一):流媒体系统

ZEGO即构

TCP udp RTC HLS RTMP

我的敏捷历程 —— 兼评《敏捷整洁之道 - 回归本源》

FollowFlow

敏捷开发 Agile 极限编程 XP

spring Cloud Eureka Rest接口重写

xcbeyond

Java SpringCloud Eureka

如何利用k8s拉取私有仓库镜像

Damon

Docker k8s

钓鱼网站:详解hosts文件

xcbeyond

Java 域名解析 hosts

一切皆可等待-InfoQ