在Rx中安排定期事件的正确方法是什么?

时间:2014-06-18 15:42:02

标签: c# system.reactive

简单的问题,我希望:我正在编写一个应用程序,我想从数据库中检索数据;为此,我选择使用Rx将数据库表示为一系列值。

我只想轮询数据库(因此发生我的观察者的通知),最多每5秒一次。现在,我有这样的事情,调度程序正在安排一个周期性任务,导致我的观察者订阅我的数据库的observable:

_scheduler.SchedulePeriodic(_repository, TimeSpan.FromSeconds(5),
    (repo) => repo.AsObservable()
        .Where(item => _SomeFilter(item))
        .Subscribe(item => _SomeProcessFunction(item))
);

为简洁起见省略了功能名称等; repo.AsObservable()只是一个函数,在该点返回存储库中所有项目的IObservable<T>

现在,我认为这是正确的做事方式,但是在我提出这个解决方案之前,我确实提出了一个不同的解决方案,其中我有Observable.Timer订阅的观察者会订阅相反,每个计时器的AsObservable()返回值。

我的问题是,这似乎很奇怪 - 为什么我多次订阅这个观察者?

很抱歉,如果这个问题令人困惑,那么在写这篇文章时会让我感到困惑,但是调度程序对我来说也很困惑:P

1 个答案:

答案 0 :(得分:6)

如果使用内置运算符而不是手动调度任务会怎样?

repo.AsObservable()
    .Where(_SomeFilter)
    // Wait 5 seconds before completing
    .Concat(Observable.Empty<T>().Delay(TimeSpan.FromSeconds(5))
    // Resubscribe indefinitely after source completes
    .Repeat()
    // Subscribe
    .Subscribe(_SomeProcessFunction);