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