如何在 Rx.NET 中延长可观察计时器的持续时间



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

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

var _timerDisposable = Observable.Timer(duration)
.ObserveOn(Scheduler.Default)
.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干净地将旧订阅释放到以前的可观察量(计时器),并订阅新的可观察量。

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

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

--

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

相关内容

  • 没有找到相关文章

最新更新