从IObservable<T>到Task

3
这就是情况。假设我正在某处填充一个Collection。每次添加一个元素时,IObservable会为其订阅者调用OnNext()。
现在,集合将被填满。(我在读一些东西,然后我完成了阅读...什么的)。此时,订阅者将调用OnComplete()。
然而,用户不会观察这种方法。相反,他将调用一个异步方法,并等待它......他并不太关心自己读了什么,他只关心自己已经完成了阅读。
因此,基本上,我希望从一个IObservable中获得一个任务,该任务在IObservable为其订阅者调用OnComplete()时返回。我特别希望用户不使用观察者,而只是知道在await调用后发生的任何事情都将在填充集合之后发生。
也许ToTask()方法可以做到这一点?我无法通过文档来确定。

2
只是顺便提一下,你应该避免“混合使用不同的单子”——即在IEnumerable<T>IObservable<T>Task<T>之间切换。每次更改都会引入代码中可能过早强制执行和/或引入意外行为的点。Observables比Tasks更强大和表达力更强,因此最好保持在Observables中。 - Enigmativity
2
此外,重要的是要理解,即使 observables 被称为集合,它们也不会被“填充”。它们存在于时间维度中,因此它们是在时间中发生的对象实例。它们是一个可能有或没有结束的时间线。 - Enigmativity
听起来你应该一直使用Task。你没有一个流,只有一个单一的结果。 - user630190
1个回答

8
如果您正在使用 Rx 2.0 或更高版本,您可以 await 返回可观察对象中的最后一个项目。也就是说,在可观察对象完成后。
var lastItem = await myObservable;

这是可能的,因为在 Rx 2.0 中,IObservable 上添加了一个 GetAwaiter 扩展方法,使得可以 await observables。还有一些方便的扩展方法,允许您指定要等待的元素。

这里有一篇不错的博客介绍:点击这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接