FileSystemWatcher
のChanged
イベントを監視可能なシーケンスに変換するコードをいくつか書きました。
私の目標は、すべてのファイル システムの変更を別々のストリームに分割し、それらを調整することです。
たとえば、0.5 秒に 3 回変更される 10 個の異なるファイルがある場合、ファイルごとに 1 回だけ通知を受け取ります。
ただ、気になるのはGroupBy()
オペレーターです。これが機能するためには、(私が推測するに) 時間をかけてグループを構築し続け、少量のメモリを消費し続ける必要があります。
これにより「リーク」が発生しますか?もしそうなら、どうすればそれを防ぐことができますか?
FileSystemWatcher _watcher = new FileSystemWatcher("d:\\") {
EnableRaisingEvents = true,
NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size
};
void Main()
{
var fileSystemEventStream =
Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>
(
_ => _watcher.Changed += _,
_ => _watcher.Changed -= _
)
.ObserveOn(ThreadPoolScheduler.Instance)
.SubscribeOn(ThreadPoolScheduler.Instance)
.GroupBy(ep => ep.EventArgs.FullPath, ep => ep.EventArgs.FullPath)
;
var res =
from fileGroup in fileSystemEventStream
from file in fileGroup.Throttle(TimeSpan.FromSeconds(1))
select file;
res.Subscribe(
ReceiveFsFullPath,
exception => {
Console.WriteLine ("Something went wrong - " + exception.Message + " " + exception.StackTrace);
});
Console.Read();
}
void ReceiveFsFullPath(string s){
Console.WriteLine ("Received file system event on thread " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine(s);
}