FileSystemWatcher
のChanged
イベントを観測可能なシーケンスに変換するコードを記述しました。Reactive Extensionsのコードがメモリにリークしますか?
私の目標は、2つのすべてのファイルシステムを分割して、別々のストリームに変更し、それらを調整することです。
たとえば、半分の時間で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);
}
あなたがC#ガーナージコレクターを信じていて、そうしてはならない場合、漏れはありません –
しかし、グループは同じファイルを参照しています。私はC#がガベージコレクトされていることを理解していますが、それはメモリリークが発生しないことを意味するものではありません。 –
[SciTechのメモリプロファイラ](http://memprofiler.com/)などのプロファイラを付けて試してみましたか? –