【问题标题】:Event throttling / queuing - Reactive Extensions?事件节流/排队 - 反应式扩展?
【发布时间】:2012-06-15 16:19:24
【问题描述】:

我希望在我的一个视图模型中实现一些限制行为。这是一个 Silverlight 应用程序,但我认为这不是特别重要。

考虑一个具有三个属性的类:

  • 属性1
  • 属性2
  • 属性3

每当更新这些属性之一时,都需要刷新。

private void Refresh()
{
    //Call out to the server, do something when it comes back
}

我的目标如下:

  • 如果正在刷新,我们最好取消对服务器的调用,并发出新请求
  • 如果属性发生更改,我们应该留出一些小时间窗口(可能是 0.1 秒)等待其他更改。这样,如果多个属性快速更改(例如,以编程方式),我们不会向服务器发送垃圾邮件请求。每次更改都可以重置 0.1 秒的窗口,但不是必需的。

如果重要的话,我正在使用 ChannelFactory 实现来进行服务器调用。

我可以使用什么样的模式来实现这一点?这是响应式扩展可以帮助我的事情吗?

编辑:

将 Paul 的答案标记为正确。虽然 ReactiveUI 目前不适用于 silverlight5,但它清楚地概述了使用 Rx 解决问题的方法/组合步骤。

【问题讨论】:

标签: c# .net system.reactive silverlight-5.0


【解决方案1】:

以下是使用 ReactiveUI 的方法:

IObservable<TheData> FetchNewData() 
{
    // TODO: Implement me
}

this.WhenAny(x => x.Property1, x => x.Property2, x => x.Property3, (x,y,z) => Unit.Default)
    .Throttle(TimeSpan.FromMilliseconds(200), RxApp.DeferredScheduler)
    .Select(x => FetchNewData())
    .Switch()    // We only care about the req corresp. to latest values of Prop1-3
    .ToProperty(this, x => x.Data);

更新:以下是如何保证一次只运行一个,但需要注意的是您可能会得到无序的结果。

this.WhenAny(x => x.Property1, x => x.Property2, x => x.Property3, (x,y,z) => Unit.Default)
    .Throttle(TimeSpan.FromMilliseconds(200), RxApp.DeferredScheduler)
    .Select(_ => Observable.Defer(() => FetchNewData()))
    .Merge(1)
    .ToProperty(this, x => x.Data);

您描述的行为实际上可能是不可取的,因为如果属性不断变化,您最终会得到一个旧请求队列 - 如果您制作类似“BufferingSwitch() " 在确定没有更改之前不会返回其结果的运算符 - 实际上写起来很酷。

故事的寓意,Async Is Complicated™ :)

【讨论】:

  • 谢谢,乍一看似乎是我需要的。这对silverlight有效吗?我找不到WhenAny 扩展方法来尝试一下。
  • @ShaunRowan:该扩展来自 ReactiveUI (reactiveui.net)。以前的版本 (v2) 支持 Silverlight。当前版本(v3)没有。特别是如果你在做 MVVM,这是一个非常棒的库。
  • 谢谢,我去看看!出于某种原因,我的大脑刚刚将“ReactiveUI”换成了“反应式扩展”。 (我不知道图书馆。)
  • @ShaunRowan 当前版本支持 SL5 一旦我下车并修复它
  • @ShaunRowan 这有点棘手 - 您当然可以将 FetchNewData 限制为一个并发请求,但是您可能会收到乱序的请求。我已经在上面展示了如何做到这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多