如何延长 Rx.NET 中 Observable Timer 的持续时间?

How to extend the duration time of Observable Timer in Rx.NET?

将 C# 与 Rx.NET 结合使用。有没有办法延长 Observable.Timer 启动后的持续时间? Join(...)Expand(...) 有办法吗?我不喜欢处理旧计时器,也不喜欢创建一个新计时器。

示例:初始持续时间为 5 分钟。但是在计时器完成前1分钟,我喜欢将它重置为5分钟,再次测量5分钟。

var _timerDisposable = Observable.Timer(duration)
.ObserveOn(Scheduler.Default)
.Subscribe((_) => DoSomething());

这里正确的做法是销毁订阅,然后创建一个新的可观察序列。通过处置,您将取消订阅计时器,并且在持续时间到期时不会收到通知。 请注意,无需指定默认调度程序。

  _timerSubscription.Dispose();
  _timerSubscription = Observable.Timer(duration)                                   
                                 .Subscribe((_) => DoSomething());

--

编辑:有很多方法可以满足您的要求。由于没有提供更广泛的上下文,这可能是最简单的方法。其他人建议的方法虽然在技术上是正确的,但可能令人困惑且难以解释,但在您的用例中也可能更有效。将来,更完整的示例或问题描述可能会产生更好的结果。

这类似于@Krzystztof 的回答,但更符合 Rx:

var DoSomething = new Action(() => {});
var duration = TimeSpan.FromSeconds(5);
var resetSignal = new Subject<Unit>();


var scheduler = Scheduler.Default;
resetSignal
    .Select(_ => Observable.Timer(duration))
    .Switch()
    .ObserveOn(scheduler)
    .Subscribe(_ => DoSomething())

// to reset or start timer:
resetSignal.OnNext(Unit.Default);

解释:

每次resetSignal产生一个值时,都会启动一个新的Timer。接下来,Switch 运算符自动切换到最新的可观察对象(在我们的例子中是最新的计时器),当新的出现时有效地忽略旧的。在幕后,Switch 干净地处理了对以前的可观察对象(计时器)的旧订阅,并订阅了新的可观察对象。