使用Observable限制异步轮询

时间:2012-07-26 08:05:15

标签: c# system.reactive polling

也许我在这里推动Rx的合理范围,但我想要做的是轮询一个远程状态,但速率将轮询限制在合理的范围内。

我目前拥有的伪代码:

IObservable<data> RemoteObservable(Remote remote) 
{
   var onceonly = Observable.FromAsyncPattern(remote.Begin, remote.End);
   return Observable.Defer(() => onceonly())
                    .ObserveOn(Scheduler.ThreadPool)
                    .Repeat();
}

我无法确定是否可以使用ThrottleInterval。在我看来,限制是关于限制传入的事件,而不是限制重复率。


编辑:我在下面询问/回答了一个关于子问题的单独问题:How to make a `Defer`ed observable only subscribe for the first subscriber?

子问题:有没有办法在这种Observable上允许两个订阅,而没有创建两倍的远程调用?我问,因为我想在UI中不断显示状态,但也会在某些活动中监控它(我试图用Observables做这个的原因之一)。

3 个答案:

答案 0 :(得分:1)

怎么样:

var onceOnly = Observable.FromAsyncPattern(remote.Begin, remote.End);

Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(5))
    .SelectMany(_ => onceOnly());

答案 1 :(得分:0)

对于子问题,听起来你可能有一件事听一下该对象的事件(我不熟悉Observables所以不确定它是如何工作的)然后让那个东西触发它自己的事件,你可以多次订阅。

答案 2 :(得分:0)

我设法找到了一个类似的问题here,我的代码的更新示例如下所示:

return Observable.Defer(() => onceonly())
                 .ObserveOn(Scheduler.ThreadPool)
                 .Concat(Observable.Empty<data>().Delay(TimeSpan.FromSeconds(5)))
                 .Repeat();

似乎正常工作。

(但是我发现每次调用remote时都需要重新验证我的FromAsyncPattern对象。不知道我怎么能Repeat那个