【问题标题】:How can I fix race condition in this "reset after time" observable?如何在可观察到的“时间后重置”中修复竞争条件?
【发布时间】: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


    【解决方案1】:

    执行第一个 observable 的更简洁的方法如下:

    var okStatusObservable2 = input
        .Select(_ => Observable.Return(true).Delay(longerTime).StartWith(false))
        .Switch();
    

    解释:对于每条input 消息,产生一个以 false 开头的 observable,longerTime 之后产生一个 true。 Switch 意味着如果你有一个新的 observable,只需切换到它,这将排除最后的全部清除 true

    对于您的第二个 observable,除非两个 observable 之间的 longerTime 不同,否则第一个 observable 中的每个第一个 false 都会在第二个 observable 中产生一个 false。这是你的意图吗?

    另外,您的 Where 搞砸了(应该是 .Where(b => !b).Where(b => b == false).Where(_ => false) 将始终评估为 false 不返回任何内容。

    除此之外,我认为您的解决方案是合理的。

    【讨论】:

    • 感谢Switch 解决方案,对我来说看起来很干净。关于Where:当然。这是一个疏忽。我将为此编辑我的问题,以避免对其他人造成任何混淆。谢谢。关于我的第二个可观察的:是的,这是故意的,并且可能第二个 longTime 将是更长的延迟。结合Take(1),我只想让一个事件触发一些动作,例如重新启动整个程序。
    • 我喜欢干净地使用Observable.Return(true).Delay(longerTime).StartWith(false)。不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多