长期以来一直困扰着我的关于FileSystemWatcher的事情之一就是它针对文件的单个逻辑更改触发多个事件。我知道它为什么会发生,但我不想在意 - 我只想重新分析文件一次,而不是连续4-6次。理想情况下,只有在给定文件完成更改时才会触发事件,而不是每一步。无功扩展与FileSystemWatcher
多年来,我已经想出了不同程度的丑陋这个问题的各种解决方案。我认为Reactive Extensions是最终的解决方案,但是我做得不对,我希望有人能指出我的错误。
我有一个扩展方法:
public static IObservable<IEvent<FileSystemEventArgs>> GetChanged(this FileSystemWatcher that)
{
return Observable.FromEvent<FileSystemEventArgs>(that, "Changed");
}
最后,我想,让每名一个事件,在给定的时间内 - 这样在一个单一的文件名四个连胜事件被减少到一个事件,但是如果多个文件同时被修改,我不会失去任何东西。 BufferWithTime
听起来像是理想的解决方案。
var bufferedChange = watcher.GetChanged()
.Select(e => e.EventArgs.FullPath)
.BufferWithTime(TimeSpan.FromSeconds(1))
.Where(e => e.Count > 0)
.Select(e => e.Distinct());
当我订阅了这个观察到,被监视文件中的单个变化触发我的订阅方法一排,其中相当失败的目的四倍。如果我删除Distinct()
的呼叫,我会发现四个呼叫中的每一个都包含两个相同的事件 - 所以有一些缓冲正在进行。增加TimeSpan传递给BufferWithTime
似乎没有影响 - 我在20秒内没有任何行为改变。
这是我第一次进入Rx,因此我可能错过了一些明显的东西。我做错了吗?有更好的方法吗?感谢您的任何建议...
你能把它包装在一个完整的程序中吗?我有兴趣研究它... – 2010-04-20 19:28:48
是的,我会做一个孤立的测试用例。现在我想到了,我有不止一个观察者处理多个文件夹,并且我需要证明它不是四个不同的观察者以某种方式接收同一对事件。 – 2010-04-20 21:13:30