我寫了一些代碼,將FileSystemWatcher
的事件變成可觀察的序列。這個Reactive Extensions代碼是否會泄漏內存?
我的目標是兩次拆分所有文件系統的變化,以分離流並限制它們。
例如,如果我有10個不同的文件在半秒內變化3次,我只會爲每個文件得到一次通知。
雖然我擔心的是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#garnage收集器,而你不應該這樣做,那就不會有泄漏 –
但是這個組織持續引用同一個文件。我明白C#是垃圾收集,但這並不意味着內存泄漏不會發生。 –
您是否嘗試過添加[SciTech的Memory Profiler](http://memprofiler.com/)等探查器來查看您是否在泄漏? –