yos*_*rel 5 c# system.reactive
您知道如何订阅保持x时间的状态吗?
例如,如果我具有BehaviorSubject<int>表示0到100之间的int值,并且该值随时间而变化,那么我想在该值小于50时连续10秒订阅。
如果该值暂时变回50以上,然后又下降50,我想再数10秒钟。我怎样才能做到这一点?
非常感谢!
这是一个相当简洁的可观察查询,对我来说似乎正常工作:
var below50longerthan10seconds =
subject
.Select(x => x < 50)
.DistinctUntilChanged()
.Select(x =>
Observable.Delay(
Observable.Return(x),
TimeSpan.FromSeconds(10.0)))
.Switch()
.Where(x => x)
.Select(x => Unit.Default);
Run Code Online (Sandbox Code Playgroud)
这是细分。
true小于50时将值从0更改为100 ,false否则:
.Select(x => x < 50)
Run Code Online (Sandbox Code Playgroud)
仅保留true&之间的实际更改false:
.DistinctUntilChanged()
Run Code Online (Sandbox Code Playgroud)
将值投影到新的可观察对象中,该可观察对象将延迟10秒:
.Select(x =>
Observable.Delay(
Observable.Return(x),
TimeSpan.FromSeconds(10.0)))
Run Code Online (Sandbox Code Playgroud)
现在执行.Switch()-如果一个新x的延迟可观察值之前出现一个新值,则它将被忽略,因为一个新的延迟可观察值即将到来:
.Switch()
Run Code Online (Sandbox Code Playgroud)
仅选择true原始流低于50时的含义:
.Where(x => x)
Run Code Online (Sandbox Code Playgroud)
选择Unit.Default仅是因为有一个true没有任何false值的值流很奇怪:
.Select(x => Unit.Default);
Run Code Online (Sandbox Code Playgroud)
因此,现在您有了一个IObservable<Unit>当原始流产生的值小于50且在10秒内不会产生大于或等于50的值时释放新值的。
那是你想要的吗?
我希望我不会错过任何东西,但我认为最简单的方法是:
BehaviorSubject<int> value = new BehaviorSubject<int>(0);
value.Select(v => v < 50).DistinctUntilChanged().Throttle(TimeSpan.FromSeconds(10))
.Where(x => x).Subscribe(b => DoSomething());
Run Code Online (Sandbox Code Playgroud)
Enigmativity的答案让我开始了解如何处理这个问题。谢谢!