QCon全球软件开发大会让你与150+位一线国内外技术专家深度交流,购票立减 ¥880 了解详情
写点什么

一切皆可等待

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

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

关注

评论

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

Windows10 Kafka Docker 集群搭建

Docker kafka

架构师训练营第二期 Week 12 作业

bigxiang

架构师训练营第2期

电动车基本知识(28天写作 Day3/28)

mtfelix

自动驾驶 28天写作 电动汽车

HDFS SHELL详解(3)

罗小龙

hadoop 28天写作 hdfs shell

Java Kafka 简单示例

Java kafka

Java并发编程实战(3)- 互斥锁

技术修行者

Java 并发编程 多线程

week-10-part2 学习总结

陈龙

week-10-part1微服务调用的时序图

陈龙

week-11-part1分析系统不可用的原因

陈龙

Java程序经验小结:谨慎的使用本地方法

后台技术汇

28天写作

架构师训练营一期大作业一

陈龙

构师训练营 - 第十二周课后练习

joshuamai

产品与服务

JiangX

创业 产品 投资 服务 28天写作

MySQL慢查询(下):问题解决,干货总结

架构精进之路

MySQL MySQL 高可用 MySQL优化 28天写作

从大局着眼,立微处发力

张老蔫

28天写作

第12周作业

Jack

week-11-part2 学习总结

陈龙

第六周 技术选型(二) 作业 「架构师训练营 3 期」

feiyun123

构师训练营 - 第十二周学习总结

joshuamai

第七周 学习总结

简简单单

创业失败启示录|校园里的蓝色单车(分析篇)

青城

创业 28天写作 创业失败启示录 青城

架构师系列 13 Spark 大数据处理在金融领域中的应用

桃花原记

RocketMQ如何保证消息可靠性

废材姑娘

RocketMQ

有关架构设计原则的总结

跳蚤

第七周 性能优化作业

简简单单

架构师训练营一期大作业二

陈龙

第七周 性能优化(一) 作业 「架构师训练营 3 期」

feiyun123

堡垒机是什么?

python自学 第一章 初始python

WEB前端修行日志

Python

数仓面试高频考点--解决hive小文件过多问题

五分钟学大数据

大数据 hive 面试题 数仓

前端也要懂机器学习(上)

执鸢者

机器学习 前端 特征选择

一切皆可等待-InfoQ