Rx - 暂停Observable.Interval

时间:2016-02-20 20:43:57

标签: c# system.reactive observable

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

我目前的代码:

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

1 个答案:

答案 0 :(得分:5)

这样做对你有用吗?

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)即可停止并开始。