Входные данные - это наблюдаемая, которая выдает значение каждый раз, когда возникает проблема.
В качестве вывода я хочу, чтобы наблюдаемая составляла значение, если проблемы существуют дольше. Другими словами, я хочу «сбросить» наблюдаемый результат (не производить значения), если последняя проблема устарела.
Мое решение:
// first get an observable producing statusOk values (true = ok, false = not ok)
var okStatusObservable = input.Select(_ => true).Throttle(longerTime)
.Merge(input.Select(_ => false));
// we only want event if statusOk=false for a longer time
var outputObservable = okStatusObservable
.DistinctUntilChanged() // only changes
.Throttle(evenLongerTime) // wait for stable status
.Where(_ => _ == false); // only interested in bad status
Я думаю, что okStatusObservable
может содержать условие гонки: если вход получает события с интервалом времени точно longerTime
, а вторая часть слияния (Select
/ false
) выдаст логическое значение перед первой частью (Select
+ Throttle
/ true
) тогда это приведет к тому, что okStatus будет true
99,9% времени, когда обратное будет правильным.
(PS: чтобы иметь значение статуса с начала, мы могли бы добавить .StartWith(true)
, но это не имеет значения в отношении состояния расы.)