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

时间:2019-01-22 13:17:08

标签: c# system.reactive rx.net

在Rx.NET中使用C#。 Observable.Timer启动后,是否可以延长其持续时间? Join(...)Expand(...)有办法吗?我不喜欢处置旧计时器,也不喜欢创建新计时器。

示例:初始持续时间为5分钟。但是在计时器结束前1分钟,我想将其重置为5分钟,以再次测量5分钟。

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

2 个答案:

答案 0 :(得分:4)

这类似于@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干净地将旧订阅分配给先前的可观察对象(计时器),并订阅新的可观察对象。

答案 1 :(得分:-1)

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

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

-

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