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 在某些情况下跳过值更改的主要内容,如果未能解决你的问题,请参考以下文章

如何在不跳过值的情况下读取 PHPExcel 中的空单元格?

如何更改主键自动增量,以便在删除行时不会跳过值[重复]

“更改开”中有两个值的条形图,跳过值为 0 的条形图

win7系统备份显示“备份已完成但跳过了某些文件”怎么办啊

搜索+反向搜索腌制文件,跳过值

如果不与其他表共享 ID,如何从 SQL 中跳过值