我正在替换rx的Observable.Interval上的计时器,我遇到了一个问题。我不知道如何暂停这样的计时器。我的意思不是暂停订阅,而是暂停和恢复时间计数。我知道如何以肮脏的方式做到这一点,但我想知道也许更好的解决方案。
我当前的代码:
var RemainingTimes = Observable
.Interval(TimeSpan.FromMilliseconds(refreshInterval))
.Select(t => _provider.Duration - TimeSpan.FromMilliseconds(t * refreshInterval))
做这件事对你有用吗?
var pause = false;
var RemainingTimes =
Observable
.Interval(TimeSpan.FromMilliseconds(refreshInterval))
.Where(x => pause == false)
.Select(t => _provider.Duration - TimeSpan.FromMilliseconds(t * refreshInterval));
然后,您只需更改pause = true
并pause = false
将其关闭即可打开。
如果您想在不重新订阅的情况下实际启动和停止计时器,那么这是一种方法:
var pauser = new Subject<bool>();
var RemainingTimes =
pauser
.StartWith(true)
.Select(b => b
? Observable.Empty<DateTime>()
: Observable
.Interval(TimeSpan.FromMilliseconds(refreshInterval))
.Select(t => _provider.Duration - TimeSpan.FromMilliseconds(t * refreshInterval)))
.Switch();
然后只需拨打pauser.OnNext(true)
和pauser.OnNext(false)
即可停止并启动。