【问题标题】:How do I create an Rx observable that gets an immediate value and then samples?我如何创建一个 Rx observable 获得一个即时值然后采样?
【发布时间】:2015-06-12 08:56:38
【问题描述】:

我想使用 Sample 来减少从我的 observable 中出现的项目的频率,但我想立即看到第一个事件通过而不会在示例持续时间内被阻止。之后,我希望 Sample 只在采样间隔上给我一个项目。

简单示例的代码是:

var sampler = Observable
        .Interval(TimeSpan.FromSeconds(2))
        .Select(_ => Unit.Default);

var seq = Observable.FromEventPattern<IntEventArgs>(h => _eventSource.Happened += h, h => _eventSource.Happened -= h)
        .Sample(sampler);

所以我尝试使用它使其立即生成一个项目,但这完全停止了 observable 的工作:

var seq = Observable.FromEventPattern<IntEventArgs>(h => _eventSource.Happened += h, h => _eventSource.Happened -= h)
        .Sample(Observable.Return(Unit.Default).Concat(sampler));

然后我认为问题可能出在采样器的 Unit.Default 部分,所以我尝试摆脱它,但现在出现编译器错误:

var sampler = Observable
        .Interval(TimeSpan.FromSeconds(2));

var seq = Observable.FromEventPattern<IntEventArgs>(h => _eventSource.Happened += h, h => _eventSource.Happened -= h)
        .Observable.Return(Unit.Default).Concat(sampler);

我尝试在谷歌上搜索“c# 即时可观察样本”之类的内容,但没有显示任何内容,我想我使用了错误的术语,但不确定我需要什么...

有什么想法吗?

【问题讨论】:

  • 第三个 seq 声明末尾的代码 - .Observable.Return(Unit.Default).Concat(sampler); - 没有意义。你能解决吗?
  • 确实,这就是编译器不喜欢它的原因。如果我能解决它,那么我可以回答这个问题:-/
  • 这种错误不是有效的 c# 语法,但无法编译。这是无效的 c# 语法 - 你肯定能解决这个问题吗?
  • 啊我没看到结尾的;。这不是问题 - 它不喜欢 .Observable.Return

标签: c# .net system.reactive observable


【解决方案1】:

这对你有用吗?

var observable = Observable.Merge<IntEventArgs>(h => _eventSource.Happened += h, 
                                                h => _eventSource.Happened -= h)
                           .Publish()
                           .RefCount();

var seq = Observable.Merge<IntEventArgs>(observable.FirstAsync(),
                                         observable.Skip(1).Sample(sampler));

Publish() 方法确保您只注册一次活动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多