Мой сценарий:
У меня есть вычисления, которые должны выполняться примерно раз в секунду. После запуска нужно подождать около 200 мсек, чтобы другие вещи наверстали упущенное. Если вычисление все еще продолжается через секунду, оно должно быть запущено во второй раз, но если программа должна подождать, пока оно не закончится, и начать следующее вычисление через 200 мс после завершения.
То, как я делаю это сейчас:
_refreshFinished = new Subject<bool>();
_autoRefresher = Observable.Interval(TimeSpan.FromMilliseconds(1000))
.Zip(_refreshFinished, (x,y) => x)
.Subscribe(x => AutoRefresh(stuff));
Проблема с этим кодом заключается в том, что я не вижу способа отложить задержку после завершения вычислений.
Метод Delay задерживает только первый элемент наблюдаемой коллекции. Обычно это правильное поведение один раз, так как вам придется буферизовать бесконечное количество элементов, если вы хотите буферизовать всех, но поскольку задержка вызова Autorefesh на 200 мс задерживает вывод _refreshFinished на 200 мс, не будет никаких накладных расходов ,
По сути, я хочу Observable, который запускает каждый MaxTime (some_call, 1000 мс), затем задерживается на 200 мс или даже лучше, какое-то динамическое значение. На данный момент меня даже не волнуют значения, которые проходят через это, хотя это может измениться в будущем.
Я открыт для любых предложений