長期以來一直困擾着我的關於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