【发布时间】:2010-08-16 03:42:21
【问题描述】:
我有一个IObservable,它以随机间隔产生值,我想限制这个序列。我发现的一件事是Throttle 运营商对“节流”的定义与我的不同。
Throttle 仅在指定的时间间隔过后无声 产生值(它产生最后看到的值)。我认为节流意味着在指定的时间间隔内产生值(当然,除非有静默)。
说,我希望 Observable.Interval(100).Select((_,i) => i).Throttle(200) 产生(以任何性能/时序问题为模)偶数,因为我将其限制为“半速”。然而,这个序列根本没有产生任何价值,因为从来没有一段长度为 200 的静默期。
所以,我发现Sample 实际上做了我想要的“节流”行为。 Observable.Interval(100).Select((_,i) => i).Sample(200) 产生(同样,以任何性能/时序问题为模)偶数序列。
但是,我还有另一个问题:间隔会有所不同,具体取决于最后一个“采样”值。我想要的是编写一个看起来像这样的运算符:
public static IObservable<T> Sample<T>(this IObservable<T> source, Func<T, TimeSpan> intervalSelector);
intervalSelector 参数产生下一个样本的间隔,而第一个样本……要么取自第一个值,要么取自附加参数,我不在乎。
我试着写这个,但我最终得到了一个大而复杂的结构,它不能很好地工作。我的问题是,我可以使用现有的运营商(也就是单线)来构建它吗?
【问题讨论】:
标签: .net system.reactive