代码之家  ›  专栏  ›  技术社区  ›  ZeroBugBounce

如何创建iobservable<t>它每隔-n秒返回一个值,而不跳过任何

  •  2
  • ZeroBugBounce  · 技术社区  · 15 年前

    下面这个例子是我尝试这样做的:

    var source
        = Observable.Sample(
              Observable.Range(1, int.MaxValue), TimeSpan.FromSeconds(2));
    

    但是,当i.subscribe()到这个可观察的并将其输出到控制台时,它会显示这样一个序列,每2秒输出一行:

    OnNext: 312969
    OnNext: 584486
    OnNext: 862009
    

    显然.range()observable正在运行,而.sample()observable在每个输出之间等待2秒。我想知道如何创建一个可观察的,但这不允许跳过值,所以很明显,这看起来是这样的:

    OnNext: 1
    OnNext: 2
    OnNext: 3
    

    每2秒从.range()输出一个值。我如何在.NET的反应式扩展中实现这一点?

    2 回复  |  直到 15 年前
        1
  •  4
  •   spender    15 年前

    我最近通过创建一个 Observable that emits timed events every timeInterval . 然后,您可以使用zip方法将可观察到的事件与可观察到的计时器事件同步。

    例如:

        var timer = 
            Observable
                .Timer(
                    TimeSpan.FromSeconds(0), 
                    TimeSpan.FromSeconds(2)
                );
        var source = Observable.Range(1, int.MaxValue);
        var timedSource = source.Zip(timer,(s,t)=>s);
        timedSource.Subscribe(Console.WriteLine);
    
        2
  •  5
  •   Community Mohan Dere    8 年前

    使用Observable.GenerateWithTime:

    var source = Observable.GenerateWithTime(1, _ => true, x => ++x, x => x, x => TimeSpan.FromSeconds(2));
    

    可观测范围使用可观测生成,所以这是一种方法。还有很多其他的方法。

    对于更高级的东西,例如以相同的方式处理事件(因为这显然只在您自己生成数据时有帮助),请参见 How to throttle event stream using RX? 已经解决了这个问题。