【发布时间】:2019-03-26 04:49:03
【问题描述】:
Input 是一个 observable,每次出现问题时都会产生一个值。
作为输出,我想要一个 observable,如果问题存在更长时间,它会产生一个值。换句话说,如果最后一个问题已经过时,我想“重置”输出 observable(不产生值)。
我的解决方案:
// 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)将在第一部分(@ 987654326@+Throttle / true) 那么这将导致 okStatus 为 true 99.9% 的时间正好相反。
(PS:要从一开始就有状态值,我们可能会添加.StartWith(true),但这对于竞争条件无关紧要。)
【问题讨论】:
标签: c# observable system.reactive race-condition throttling