如何有条件地停止可观察对象的时间间隔序列?

how to conditionally stop an observable's timed interval sequence?

下面是每秒运行一次按顺序输出一个数字的代码:

IObservable<DateTimeOffset> timestamps =
    Observable.Interval(TimeSpan.FromSeconds(1))
    .Timestamp()
    .Where(x => x.Value % 2 == 0)
    .Select(x => x.Timestamp);
timestamps.Subscribe(x => Console.WriteLine(x));

有效。我的问题是,我希望 Observable 会生成这个时间戳并在满足某些条件时停止,比如

if (x==100) then stop

有没有办法通过 Rx/Linq 实现此目的?

非常感谢。

"Stop"是通知OnComplete。 "Throw" 是通知 OnError。 有一些运营商可以推送这两种类型的通知。

您还可以使用 TakeWhile 运算符,它在 IEnumerable 中也可用,它们的行为非常相似。

Observable.Interval(TimeSpan.FromSeconds(0.01))
.Where(x => x % 2 == 0)
.TakeWhile(x => x != 100)
.Timestamp()
.Select(x => x.Timestamp);

对于与您的流异步的通知,有 ...Until 运算符,例如 TakeUntilSkipUntil。 例如,在 100 秒后停止 observable。

Observable.Interval(TimeSpan.FromSeconds(0.01))
.Where(x => x % 2 == 0)
.TakeUntil(Observable.Timer(TimeSpan.FromSeconds(100)))
.Timestamp()
.Select(x => x.Timestamp);