Rx .NET 在某些情况下跳过值更改
Posted
技术标签:
【中文标题】Rx .NET 在某些情况下跳过值更改【英文标题】:Rx .NET skip value changes by some scenario 【发布时间】:2021-11-22 03:50:15 【问题描述】:我在使用 Rx 实现某个场景时遇到了问题。我有一些代码:
enum Status NotConnected, Connecting, Connected
class Provider
public Status State get => m_state; set => this.RaiseAndSetIfChanged(ref m_state, value);
public double Divergence get => m_divergence; set => this.RaiseAndSetIfChanged(ref m_divergence, value);
public void Run(Provider provider)
provider.WhenAny(viewItem => viewItem.Divergence, change => change.Sender)
.Throttle(TimeSpan.FromMilliseconds(500))
.Subscribe(OnDivergenceChanged);
private void OnDivergenceChanged(Provider provider)
...
状态可以通过环形图NotConnected->Connecting->Connected.->NotConnected->Connecting... 初始状态为 NotConnected,Divergence 更改未被阻止。 我需要跳过更改 Divergence 值,从连接的那一刻开始(状态为 Connecting)并在“Connected”状态建立后 5 秒结束。
【问题讨论】:
【参考方案1】:这是一个可能的解决方案:
IObservable<double> Divergence;
IObservable<Status> State;
IObservable<double> onDivergenceChanged = State
.Select(state => state switch
Status.NotConnected => Divergence,
Status.Connecting => Observable.Empty<double>(),
Status.Connected => Observable.Timer(TimeSpan.FromSeconds(5)).Select(_ => Divergence).Switch(),
_ => throw new ArgumentOutOfRangeException(nameof(state), state, null)
)
.Switch();
这是非常声明性的 - 对于每个状态,要么采用: a) 数字流; b) 没有; c) 5 秒计时器后的数字。
【讨论】:
是的,答案是声明性的,但我的问题也是声明性的。这是进一步解决方案的良好起点。以上是关于Rx .NET 在某些情况下跳过值更改的主要内容,如果未能解决你的问题,请参考以下文章