【问题标题】:Reactive extensions Sample or Throttle?响应式扩展示例还是节流?
【发布时间】:2013-10-04 16:34:53
【问题描述】:

我有一个列表框,并且正在观察何时选择项目:

selectedItems.Subscribe(DoWorkWIthSelectedItems);

observable 返回一个 viewModel 项目数组,在DoWorkWIthSelectedItems 中,我浏览了选定项目的列表并做一些工作。但是,由于用户可能会非常迅速地打开/关闭垃圾邮件选择,因此每当对某个项目完成工作时,我不希望在 30 秒内再次对该项目进行任何工作。 30 秒后,如果该项目再次被选中,请继续操作。

有没有一种 Rx 方法可以做到这一点?我不确定它是 Sample 还是 Throttle。此外,我不知道使用 Rx 是否能够区分数组中适合处理或应该忽略的项目。我是否需要 viewModel 项上的附加属性来指示某些“工作”状态?

谢谢。

【问题讨论】:

  • 您是否考虑过在底层集合源上放置一个过滤器,以便该项目被过滤掉,直到它再次符合条件?
  • @GarryVass 嗯。不要认为我可以这样做,因为这些数据的其他观察者需要所有数据在到达时流过。

标签: c# wpf system.reactive


【解决方案1】:

无论是什么,都必须有某种状态。我认为您最简单的解决方案类似于(伪代码)

var recentlyUsed = new ConcurrentDictionary<T, DateTime>();
...
selectedItems
    .Do(/* remove expired items from recentlyUsed */)
    .Where(/* items are not in recently used */)
    .Do(/* add items to recently used */)
    .Subscribe(DoWorkWIthSelectedItems);  

【讨论】:

  • 谢谢布莱恩。基于 Rx 所帮助的所有事情,我不确定它是否也有一些技巧可以自己做这件事,但我正朝着同样的结论前进。我认为在我的 DoWork 方法中,我会将已处理的项目添加到列表中,并在时间限制过去后使用 ObservableTimer 删除项目。
  • 你可以用 Window 做一些魔法,但我不知道你会怎么做,我不认为它会更有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2020-02-16
  • 1970-01-01
相关资源
最近更新 更多