В поисках Реактивного способа реализации триггера для дорогостоящей операции - PullRequest
0 голосов
/ 04 мая 2018

Мой сценарий выглядит следующим образом:

  1. Асинхронные события запускаются в произвольные моменты.
  2. Я хотел бы запустить дорогостоящую операцию для пакета событий, где пакеты событий, например, разделены на 500 мс. Таким образом, если события находятся на расстоянии менее 500 мс, они принадлежат одной и той же партии. Но если прошло 500 мс без каких-либо событий, то пришло время запустить дорогостоящую операцию.
  3. Дорогая операция должна иметь данные только последнего события, все предыдущие могут быть отброшены. В идеале я хотел бы избежать накопления непостоянного числа событий, потому что оно избыточно.
  4. Дорогая операция не запускается, если в течение 500 мс нет окна тишины. Даже если до появления такого окна потребуется несколько часов.

Пока я создал глобальный экземпляр класса Subject<T>, и каждый раз, когда происходит событие, я вызываю метод OnNext(), чтобы передать событие в наблюдаемый поток, обозначенный субъектом.

Далее я понимаю, что мне нужно построить конвейер поверх моей темы, и этот конвейер должен создавать последний элемент в каждом пакете. И вот где я выхожу из себя.

1 Ответ

0 голосов
/ 04 мая 2018

Если я правильно понял вашу проблему, вы можете использовать оператор Throttle ....

var subscription = myObservable
                   .Throttle(Timespan.FromSeconds(0.5))
                   .Subscribe(DoExpensiveOperation) ;

В документации MSDN написано "Игнорируется значения из наблюдаемой последовательности, за которыми следует другое значение до истечения срока с указанным источником, dueTime и планировщиком." Другими словами, дроссель выдаст событие только после ожидания указанного промежутка времени. Однако при каждом получении нового события период ожидания сбрасывается, поэтому, если у вас есть события, поступающие быстро, ничего не будет сгенерировано до конца последовательности. Этот сайт является отличным фоном для операторов Reactive. Я также рекомендую Rx .Net HOL , который является старым и немного устаревшим, но который охватывает многие понятия в очень удобочитаемом виде.

...