как условно остановить последовательность временных интервалов наблюдаемого? - PullRequest
0 голосов
/ 12 марта 2020

Вот код, который запускается каждую секунду для вывода числа в последовательности:

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));

Это работает. У меня вопрос: я sh скажу, что Observable сгенерирует эти временные метки и остановится, когда будет выполнено какое-то условие, например

if (x==100) then stop

Есть ли способ достичь этого с помощью Rx / Linq?

Большое спасибо.

1 Ответ

2 голосов
/ 12 марта 2020

«Стоп» - это уведомление OnComplete. «Бросок» - это уведомление OnError. Есть операторы, доступные для pu sh обоих типов уведомлений.

Вы также можете использовать оператор 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.Interval(TimeSpan.FromSeconds(0.01))
.Where(x => x % 2 == 0)
.TakeUntil(Observable.Timer(TimeSpan.FromSeconds(100)))
.Timestamp()
.Select(x => x.Timestamp);
...