如何有条件地停止可观察对象的时间间隔序列?
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
运算符,例如 TakeUntil
、SkipUntil
。
例如,在 100 秒后停止 observable。
Observable.Interval(TimeSpan.FromSeconds(0.01))
.Where(x => x % 2 == 0)
.TakeUntil(Observable.Timer(TimeSpan.FromSeconds(100)))
.Timestamp()
.Select(x => x.Timestamp);
下面是每秒运行一次按顺序输出一个数字的代码:
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
运算符,例如 TakeUntil
、SkipUntil
。
例如,在 100 秒后停止 observable。
Observable.Interval(TimeSpan.FromSeconds(0.01))
.Where(x => x % 2 == 0)
.TakeUntil(Observable.Timer(TimeSpan.FromSeconds(100)))
.Timestamp()
.Select(x => x.Timestamp);