c# - 生成具有动态可变时间间隔的事件

标签 c# timer system.reactive

我有一个以很快的速度(亚毫秒)到达的数值流,我想在屏幕上显示它们的“即时值”,出于可用性原因,我应该对该流进行下采样,使用更新最后一个值可配置时间间隔。该配置将根据用户偏好通过拖动 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/

相关文章:

c# - 具有 < 10k 条目的 wpf 列表框...我如何使其高效?

c# - 在 outlook 中将邮件状态更改为已读

java - 如何在 Java Applet 中创建倒计时器?

c# - 在创建未知数量的可观察量时将其组合/合并在一起

c# - 如何使用 Rx 监控项目文件和文件的外部更改?

c# - 为什么这段代码的行为不是异步的

c# - MultiValueConverter 无法绑定(bind)到 ViewModel

c# - 计划任务时间约束

c# - 如何在 C# 中制作只显示秒和毫秒的秒表?

c# - 在 x 毫秒后打印一些内容到控制台