我有一个以很快的速度(亚毫秒)到达的数值流,我想在屏幕上显示它们的“即时值”,出于可用性原因,我应该对该流进行下采样,使用更新最后一个值可配置时间间隔。该配置将根据用户偏好通过拖动 slider 来完成。
所以我想要做的是将源流的最后一个值存储在变量中,并有一个自动重新触发计时器,用该变量的值更新显示的值。
我考虑使用 RX,如下所示:
Observable.FromEventPattern<double>(_source, "NewValue")
.Sample(TimeSpan.FromMilliseconds(100))
.Subscribe(ep => instantVariable = ep.EventArgs)
问题是,据我所知,我无法动态更改间隔。
我可以想象有很多方法可以使用计时器来做到这一点,但我更喜欢使用 RX。
最佳答案
假设您可以将样本大小的变化建模为可观察的,您可以这样做:
IObservable<int> sampleSizeObservable;
var result = sampleSizeObservable
.Select(i => Observable.FromEventPattern<double>(_source, "NewValue")
.Sample(TimeSpan.FromMilliseconds(i))
)
.Switch();
Switch
基本上可以做你想做的事,但是通过 Rx。它不会“改变”间隔:可观察量(通常)应该是不可变的。相反,每当样本大小发生变化时,它都会创建一个新的采样可观察量,订阅新的可观察量,删除对旧可观察量的订阅,然后将这两个订阅合并在一起,这样对于客户端订阅者来说它看起来是无缝的。
关于c# - 生成具有动态可变时间间隔的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48648135/