如何延长 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
干净地处理了对以前的可观察对象(计时器)的旧订阅,并订阅了新的可观察对象。
将 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
干净地处理了对以前的可观察对象(计时器)的旧订阅,并订阅了新的可观察对象。