gpt4 book ai didi

c# - 事件限制/排队 - react 性扩展?

转载 作者:太空狗 更新时间:2023-10-29 20:24:57 24 4
gpt4 key购买 nike

我希望在我的一个 View 模型中实现一些节流行为。这是一个 silverlight 应用程序,但我认为这不是特别重要。

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

  • 属性(property)1
  • 属性(property)2
  • 属性(property)3

只要这些属性之一更新,就需要刷新。

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

我的目标如下:

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

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

我可以使用什么样的模式来实现这一点?这是响应式(Reactive)扩展可以帮助我的东西吗?

编辑:

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

最佳答案

以下是使用 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™ :)

关于c# - 事件限制/排队 - react 性扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11054595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com