BT

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

C#的未来:异步序列

| 作者 Jonathan Allen 关注 615 他的粉丝 ,译者 邵思华 关注 3 他的粉丝 发布于 2015年5月7日. 估计阅读时间: 2 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

C#中的async/await语法已经得到了开发者们的广泛接受,但现在开发者们提出了新的要求。他们希望能够通过一种类似于“yield return”的语法从异步函数中返回多个值。在关于C# 7的一条新的提议中,这一功能被称为“异步序列”。

这条提议的提出者希望能够使用以下两种模式:

  • IObservable<T>,这是Reactive Extensions(Rx)的基础,后来成为了.NET 4.0中的一部分
  • IAsyncEnumerable<T>,这是由Interactive Extensions(IX)项目所引入的类型,也用于Entity Framework 7中。

定义生产者

HaloFour写道:

从一个序列的生产者的角度来看,这两种模式的yield return行为将有一些细微的差别。IObservable<T>可能会立即继续执行,而IAsyncEnumerable<T>会等到下一次调用MoveNext()方法时才会继续执行。

对于push模型来说,使用Observable.Create方法就足够了,这点已经基本为开发者所接受。而基于IAsyncEnumerable<T>的pull模型实现起来就要麻烦许多。因此,这种时刻某种异步版本的迭代函数以及“yield return”语句就能够大显身手了。

定义消费者

HaloFour继续写道:

从消费者的角度来说,这两种模式的行为应当是相同的。Observable.ForEach允许并发执行某些操作,而我认为允许foreach方法体运行多个并发线程的方式是非常不直观的(假设派发这些线程时没有使用SynchronizationContext)。如果它的实现类似于await的工作方式,那么可以让某种中间代码(例如SequenceAwaiter)处理从某个IObservable<T>获得结果缓冲的细节,或者使用某个扩展方法直接将其转型为IAsyncEnumerable<T>。

关于这个语法还没有提供任何示例,但估计它看起来应该类似于这样:

await foreach (var item in AsyncSource)

查看英文原文:C# Futures: Asynchronous Sequences

评价本文

专业度
风格

您好,朋友!

您需要 注册一个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