鉴于IObservable<T>是否有一种使用Throttle行为的方法(在添加项目时重置计时器,但让它返回在该时间内添加的所有项目的集合?
Buffer它提供了类似的功能,它可以IList<T>在每个时间跨度或计数时将数据分块.但是每次添加项目时我都需要重置时间.
我在这里看到过类似的问题,反应式扩展是否支持滚动缓冲区?,但答案看起来并不理想,而且有点旧,所以我想知道Rx-Main的发布版现在是否支持这个功能.
我一直在寻找将文件观察器包装在一个可观察的文件中以帮助处理事件,但是我在弄清楚如何从中获取我想要的行为时遇到了一些麻烦.文件监视器监视放置文件的目录.首次将文件放入该目录时,将在文件观察程序上触发Created事件.但是,如果文件很大或网络连接速度很慢,则在文件更新时会触发一系列Changed事件.我不想处理文件,直到它完成编写,所以我真正需要的是这个时间轴
|Created |Changed |Changed |Changed
________________________________________________
^Write starts ^Write finishes ^Processing Starts
Run Code Online (Sandbox Code Playgroud)
我查看了一些过滤Rx中事件的方法,但是我无法得到我需要的东西,"一旦文件文件没有被改变X秒就触发一个函数".节流是不好的,因为它会在中间丢失事件.缓冲区不好,因为缓冲区边界上可能发生事件.
我曾经考虑过使用超时但是我并没有因为他们抛出异常而感到疯狂,我希望处理在文件写入时开始,而不是一旦没有更多的事件.
Reactive Extensions与FileSystemWatcher有一个类似的问题,但从未真正解决过.
有没有一种方法可以让我轻松完成这项工作?我确信这不是一个不常见的用例.
我有2个DecimalUpDown控件,num_one和num_two,分别绑定到属性First和Second.当First更改时,它将联系服务器以计算Second的值,反之亦然.异步启动服务器调用释放UI但是,在快速触发(例如滚轮)时,最后一个请求并不总是最后一个请求,因此值可能会不同步.
使用Reactive我试图阻止调用只在用户停止更改一段时间后才触发服务器调用.问题是,当您在更新期间进行更改时,属性更改开始相互触发并根据节流阀的TimeSpan来回停留.
public MainWindow()
{
InitializeComponent();
DataContext = this;
Observable.FromEventPattern<RoutedPropertyChangedEventHandler<object>, RoutedPropertyChangedEventArgs<object>>(h => num_one.ValueChanged += h, h => num_one.ValueChanged -= h)
.Throttle(TimeSpan.FromMilliseconds(100), Scheduler.ThreadPool)
.Subscribe(x =>
{
Thread.Sleep(300); // simulate work
Second = (decimal)x.EventArgs.NewValue / 3.0m;
});
Observable.FromEventPattern<RoutedPropertyChangedEventHandler<object>, RoutedPropertyChangedEventArgs<object>>(h => num_two.ValueChanged += h, h => num_two.ValueChanged -= h)
.Throttle(TimeSpan.FromMilliseconds(100), Scheduler.ThreadPool)
.Subscribe(x =>
{
Thread.Sleep(300); // simulate work
First = (decimal)x.EventArgs.NewValue * 3.0m;
});
}
private decimal first;
public decimal First
{
get { return first; }
set
{
first = value;
NotifyPropertyChanged("First"); …Run Code Online (Sandbox Code Playgroud)