如何在 Rx.NET 中延长 Observable Timer 的持续时间?

thi*_*elf 3 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());
Run Code Online (Sandbox Code Playgroud)

Shl*_*omo 6

这类似于@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);
Run Code Online (Sandbox Code Playgroud)

解释:

每次resetSignal产生一个值,Timer就会启动一个新的值。接下来,Switch当一个新的 observable 出现时,操作员会自动切换到最新的 observable(在我们的例子中是最新的计时器),有效地忽略旧的。在幕后,Switch干净地将旧订阅处理为先前的 observable(计时器),并订阅新的 observable。