Task<T>.ContinueWith
与IObservable<T>.Subscribe
具有相同的基本概念。它们与Reactive Extension类似,足以提供转换扩展方法。由于IObservable<T>
是BCL的一部分,因此没有理由不实施IObservable<T>
。那么,Task<T>
未实施IObservable<T>
背后的原因是什么?
答案 0 :(得分:3)
Rx团队用their 2.0 beta blog post很好地介绍了这一点。这是一个大量的帖子,尽管那里有很多很棒的信息。
preemptive tl; dr = IObservable用于未来结果的序列,Task用于单个未来结果
我认为最好的解释关系的图表在那篇文章中,但不幸的是相当遥远(正如我所提到的,这是一篇非常大的帖子:)
虽然整个帖子值得一读(恕我直言),但有关Rx / Task / async / await all如何组合在一起的相关文本从标题“Rx v2.0和.NET 4.5”async“/”等待“ - 等待” - 一个更好的故事“
答案 1 :(得分:2)
我只能猜测,但我认为有一些很好的理由:
Task<T>
和IObservable<T>
实际上没有相同的基本概念。是的,两者都是异步的,但这几乎是所有共性结束的地方。两者之间的最大区别在于Task<T>
始终只有一个值,IObservable<T>
可以包含任意数量的值(或少量,包括零)。
如果Task<T>
已实施IObservable<T>
,则类似于.Net中的每个T
实施IEnumerable<T>
,返回单个结果,即对象本身。
将Task<T>
转换为IObservable<T>
是微不足道的。使用Rx中的the ToObservable()
extension method或writing it yourself。这使得你所要求的东西更加不必要。
答案 2 :(得分:2)
我希望引用Stephen Toub,MSFT(*)来自他的作品:
事实证明,虽然
也是如此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,他们可能会按照您的建议进行操作。
IObservable<T>
接口实际存在于.NET 4和4.5中的mscorlib
程序集中。所以我上面所说的并不是一个完全正确的理由。我正在修改我的猜测理由“因为他们还没有将Rx集成到.NET中”,而不是“目前因为循环依赖而不可能。”