Rx - 暂停 可观察.间隔

本文关键字:观察 间隔 暂停 Rx | 更新日期: 2023-09-27 18:35:34

我正在替换rx的Observable.Interval上的计时器,我遇到了一个问题。我不知道如何暂停这样的计时器。我的意思不是暂停订阅,而是暂停和恢复时间计数。我知道如何以肮脏的方式做到这一点,但我想知道也许更好的解决方案。

我当前的代码:

var RemainingTimes = Observable
            .Interval(TimeSpan.FromMilliseconds(refreshInterval))
            .Select(t => _provider.Duration - TimeSpan.FromMilliseconds(t * refreshInterval))

Rx - 暂停 可观察.间隔

做这件事对你有用吗?

var pause = false;
var RemainingTimes =
    Observable
        .Interval(TimeSpan.FromMilliseconds(refreshInterval))
        .Where(x => pause == false)
        .Select(t => _provider.Duration - TimeSpan.FromMilliseconds(t * refreshInterval));

然后,您只需更改pause = truepause = 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)即可停止并启动。