【问题标题】:Throttled async polling with Observable使用 Observable 限制异步轮询
【发布时间】:2012-07-27 18:06:45
【问题描述】:

也许我在这里推动了 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 执行此操作的原因之一)。

【问题讨论】:

    标签: c# system.reactive polling


    【解决方案1】:

    怎么样:

    var onceOnly = Observable.FromAsyncPattern(remote.Begin, remote.End);
    
    Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(5))
        .SelectMany(_ => onceOnly());
    

    【讨论】:

    • 感谢您的反馈。一个问题:这是否甚至在任何人订阅之前就开始投票? (我不确定这是我绝对必须避免的事情,但最好确定...)
    • 在有人订阅之前不会开始轮询。如果两个人订阅,您将获得两个计时器。
    • 好的,这和我从Defer 得到的一样(我相信)。我刚刚发现了RefCount,我想我会试试看大小...
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      看来可以工作了。

      (但是我发现我的remote 对象在每次调用FromAsyncPattern 时都需要重新实例化。不知道我该怎么做Repeat

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-09
        • 2012-02-24
        • 1970-01-01
        • 2018-12-05
        • 2020-07-07
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        相关资源
        最近更新 更多