[英]Rx observable which publishes a value if certain timeout expires
我有一個返回可觀察的方法。 這個可觀察的應該(如果evetything正常工作)每秒發布一個值。 我想要做的是,如果在沒有輸出的情況下經過了一定時間,它會發布一些自定義警報值。
private IObservable<string> GetStatus()
{
return statusProvider
.Subscribe(statusKey) //returns an IObservable<string>
.Select(st => st.ToUpper())
.DistinctUntilChanged()
.TakeUntil(disposed)
.Replay(1)
.RefCount();
}
有沒有一種簡單的方法讓我修改上面的內容,這樣如果狀態更新沒有進入30秒,則statusProvider會發布“bad”,然后如果之后有更新,則會像往常一樣發布並且計時器是再次重啟到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();
我認為以下應該有效。 它使用Throttle
,在發送任何內容之前,它將等待30秒,沒有輸入。 然后,您可以將其與預先存在的源合並,以獲得所需的行為。
var bad = source
.Throttle(TimeSpan.FromSeconds(30))
.Select(_ => "bad");
var merged = source.Merge(bad);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.