gpt4 book ai didi

c# - Rx observable,如果某个超时到期,它会发布一个值

转载 作者:行者123 更新时间:2023-11-30 12:28:03 24 4
gpt4 key购买 nike

我有一个返回可观察对象的方法。这个 observable 应该(如果一切正常)每秒发布一个值。我想要做的是让它在特定时间过去但没有输出时发布一些自定义警报值。

private IObservable<string> GetStatus()
{
return statusProvider
.Subscribe(statusKey) //returns an IObservable<string>
.Select(st => st.ToUpper())
.DistinctUntilChanged()
.TakeUntil(disposed)
.Replay(1)
.RefCount();
}

我是否有一种简单的方法来修改以上内容,以便如果 30 秒内没有状态更新,statusProvider 会发布“坏”,然后如果之后确实有更新,它会照常发布,并且计时器再次重新启动到 30 秒?

最佳答案

这是一个方法。启动一个计时器,它在到期时会产生“坏”。每次您的 statusProvider 产生状态时,计时器都会重置。

var statusSignal = statusProvider
.Subscribe(statusKey) //returns an IObservable<string>
.Select(st => st.ToUpper())
.Publish()
.RefCount();

// An observable that produces "bad" after a delay and then "hangs indefinately" after that
var badTimer = Observable
.Return("bad")
.Delay(TimeSpan.FromSeconds(30))
.Concat(Observable.Never<string>());

// A repeating badTimer that resets the timer whenever a good signal arrives.
// The "indefinite hang" in badTimer prevents this from restarting the timer as soon
// as it produces a "bad". Which prevents you from getting a string of "bad" messages
// if the statusProvider is silent for many minutes.
var badSignal = badTimer.TakeUntil(statusSignal).Repeat();

// listen to both good and bad signals.
return Observable
.Merge(statusSignal, badSignal)
.DistinctUntilChanged()
.Replay(1)
.RefCount();

关于c# - Rx observable,如果某个超时到期,它会发布一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23394441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com