Napisałem kod, który zmienia zdarzenie FileSystemWatcher
w obserwowalną sekwencję.Czy ten kod Reactive Extensions wycieka z pamięci?
Moim celem jest podzielenie wszystkich zmian w systemie plików w celu oddzielenia strumieni i ich dławienia.
Na przykład, jeśli mam 10 różnych plików, które zmieniają się 3 razy w ciągu pół sekundy, otrzymam notyfikację tylko raz dla każdego pliku.
Co mnie jednak niepokoi, to operator GroupBy()
. Aby to zadziałało (zakładam), musiałoby z czasem budować grupę i zużywać niewielkie ilości pamięci.
Czy spowoduje to "wyciek", a jeśli tak, w jaki sposób mogę temu zapobiec?
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);
}
Jeśli wierzysz w kolekcjonera C# garnage, a nie powinieneś, nie ma przecieku. –
Ale grupa utrzymuje odniesienie do tego samego pliku w czasie. Rozumiem, że C# jest zbierane śmieci, ale to nie znaczy, że wycieki pamięci się nie zdarzają. –
Czy próbowałeś dołączyć profilera, takiego jak [SciTech's Profiler pamięci] (http://memprofiler.com/), aby sprawdzić, czy nie ma wycieków? –