如何创建一个获得立即值然后采样的Rx observable?

时间:2015-06-12 08:56:39

标签: c# .net system.reactive observable

我想使用Sample来减少从我的观察中出来的物品的频率,但是我想立即看到第一个事件经历过而没有被持续到样本持续时间。之后,我希望Sample只给我一个关于采样间隔的项目。

我对简单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);

所以我尝试使用它来使它立即生成一个项目,但是这会完全阻止可观察的工作:

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);

我已经尝试使用Google搜索&#34; c#immediate observable sample&#34;但没有任何表现,我想我使用了错误的术语但不确定我需要什么...

有什么想法吗?

1 个答案:

答案 0 :(得分: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()方法确保您只为活动注册一次。