也许我在这里突破了Rx的合理范围,但我想做的是轮询远程状态,但将轮询限制在合理的范围内。
我目前拥有的伪代码:
IObservable<data> RemoteObservable(Remote remote)
{
var onceonly = Observable.FromAsyncPattern(remote.Begin, remote.End);
return Observable.Defer(() => onceonly())
.ObserveOn(Scheduler.ThreadPool)
.Repeat();
}
我不知道在那里使用Throttle
还是Interval
可能会有所帮助。在我看来,节流是指限制传入事件,而不是限制重复率。
编辑:我问/回答了一个关于下面子问题的单独问题:如何使"延迟"可观察到的内容只订阅第一个订阅者?。
子问题:有没有一种方法可以允许在这种Observable上进行两次订阅,而不会创建两倍的远程调用?我之所以这么问,是因为我想在UI中持续显示状态,但也要在一些活动中监视它(这也是我尝试使用Observables这样做的原因之一)
怎么样:
var onceOnly = Observable.FromAsyncPattern(remote.Begin, remote.End);
Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(5))
.SelectMany(_ => onceOnly());
对于这个子问题,听起来你可以让一件事监听那个对象的事件(我不熟悉Observables,所以不确定它是如何工作的),然后让那个东西触发自己的事件,你可以多次订阅。
我设法在这里找到了一个类似的问题,我的代码的更新示例如下:
return Observable.Defer(() => onceonly())
.ObserveOn(Scheduler.ThreadPool)
.Concat(Observable.Empty<data>().Delay(TimeSpan.FromSeconds(5)))
.Repeat();
此出现以工作。
(但是,我发现每次调用FromAsyncPattern
时都需要重新实例化我的remote
对象。不确定如何才能Repeat
)