在Rx.NET中使用C#。 Observable.Timer
启动后,是否可以延长其持续时间? Join(...)
或Expand(...)
有办法吗?我不喜欢处置旧计时器,也不喜欢创建新计时器。
示例:初始持续时间为5分钟。但是在计时器结束前1分钟,我想将其重置为5分钟,以再次测量5分钟。
var _timerDisposable = Observable.Timer(duration)
.ObserveOn(Scheduler.Default)
.Subscribe((_) => DoSomething());
答案 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());
-
社论:有很多方法可以完成您要问的事情。由于没有提供更广泛的上下文,因此这可能是最简单的方法。其他人建议的方法虽然在技术上是正确的,但可能会令人困惑且难以解释,但在您的用例中也可能会更好。将来,更完整的示例或问题描述可能会产生更好的结果。