为什么Task <t>没有实现IObservable <t> </t> </t>

时间:2013-04-03 22:22:21

标签: c# task-parallel-library system.reactive

Task<T>.ContinueWithIObservable<T>.Subscribe具有相同的基本概念。它们与Reactive Extension类似,足以提供转换扩展方法。由于IObservable<T>是BCL的一部分,因此没有理由不实施IObservable<T>。那么,Task<T>未实施IObservable<T>背后的原因是什么?

4 个答案:

答案 0 :(得分:3)

Rx团队用their 2.0 beta blog post很好地介绍了这一点。这是一个大量的帖子,尽管那里有很多很棒的信息。

preemptive tl; dr = IObservable用于未来结果的序列,Task用于单个未来结果

我认为最好的解释关系的图表在那篇文章中,但不幸的是相当遥远(正如我所提到的,这是一篇非常大的帖子:)

Rx vs Task

虽然整个帖子值得一读(恕我直言),但有关Rx / Task / async / await all如何组合在一起的相关文本从标题“Rx v2.0和.NET 4.5”async“/”等待“ - 等待” - 一个更好的故事“

答案 1 :(得分:2)

我只能猜测,但我认为有一些很好的理由:

  1. Task<T>IObservable<T>实际上没有相同的基本概念。是的,两者都是异步的,但这几乎是所有共性结束的地方。两者之间的最大区别在于Task<T>始终只有一个值,IObservable<T>可以包含任意数量的值(或少量,包括零)。

    如果Task<T>已实施IObservable<T>,则类似于.Net中的每个T实施IEnumerable<T>,返回单个结果,即对象本身。

  2. Task<T>转换为IObservable<T>是微不足道的。使用Rx中的the ToObservable() extension methodwriting it yourself。这使得你所要求的东西更加不必要。

答案 2 :(得分:2)

我希望引用Stephen Toub,MSFT(*)来自他的作品:

ParallelExtensionsExtras Tour - #2 - Task.ToObservable MSDN博客文章:

  

事实证明,虽然Task<TResult>没有当前实施IObservable<T>,但它实际上非常适合这样做。 observable表示由流的结尾或异常终止的任意数量的值。 Task<TResult> 符合此描述:它以单个值或异常完成。虽然.NET Framework的未来版本可能会Task<TResult>实现IObservable<T>,但我们现在可以通过将其作为Task<TResult>的扩展方法来实现相关行为。事实上, Rx 包含这样的扩展方法,ParallelExtensionsExtras

也是如此

(*)不确定“FT”是什么意思,除了MSFT是纳斯达克股票代码意味着MS,但是"MS" in "MSFT" certainly means Microsoft

答案 3 :(得分:0)

原因是,虽然Task<T>类型在.NET框架中,但Reactive Extensions(Rx)和IObservable<T>不是。 System.Reactive程序集具有System.Threading.Tasks作为依赖项,因此后者中没有任何内容可以引用前者。

如果他们将Rx添加到.NET,他们可能会按照您的建议进行操作。

编辑:

实际上,我可能说得太快了。 Take a look in the documentation.似乎IObservable<T>接口实际存在于.NET 4和4.5中的mscorlib程序集中。所以我上面所说的并不是一个完全正确的理由。我正在修改我的猜测理由“因为他们还没有将Rx集成到.NET中”,而不是“目前因为循环依赖而不可能。”