以以下为例:
var ob = Observable.Interval(TimeSpan.FromSeconds(1)).StartWith(500).Replay(1).RefCount();
我在这里想要实现的是在任何给定时间“同步”获取序列中最新项目的值。这意味着像这样的扩展FirstAsync
无法弥补我。
StartWith
andReplay
位确保始终有一个值,并且在我的实际代码中需要该位RefCount
来检测我何时可以执行一些处置操作。
因此,为了模拟这个“任何给定时间”部分,让我们尝试在 5 秒后获取最新值:
Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(x =>
{
// Try to get latest value from "ob" here.
});
所以有 5 秒的延迟,我需要5
从序列中取出值,这些是我迄今为止尝试过的,但没有成功:
ob.First()
- 返回 500ob.Latest().Take(1)
- 同上ob.MostRecent(-1).First()
- 同上ob.MostRecent(-1)
- 给了我IEnumerable<long>
满满的“500”ob.Last()
- 永远不会返回,因为它正在等待它永远不会完成的序列ob.Latest().Last()
- 同上ob.ToTask().Result
- 同上ob.ToEnumerable()
- 同上ob.MostRecent().Last()
和上面一样
人们实际上可以做到这一点的资源似乎并不多。我能找到的最接近的是:“ Rx: operator for get first and most recent value from an Observable stream ”,但它毕竟不是同步调用(仍然使用订阅),所以它对我不起作用。
有没有人知道这是否真的可行?