Napisałem coś w rodzaju web crawlera (nie do żadnych niecnych czynów). Ma on przez pewien czas trzymać w pamięci pewne informacje i w zależności od tego co znajdzie później musi zostawić część poprzednich informacji i wyrzucić resztę które się przedawniły.
Podczas prób programu szybko się okazało że potrzebuję trzymać w pamięci jednocześnie ponad 8 GB danych które się stale wymieniają.
W związku z tym używanie zwykłej pamięci stało się dla komputera i dla mnie zbyt uciążliwe więc postanowiłem zrzucać treść informacji na dysk a w obiekcie trzymać tylko nazwę pliku.
Obiekt trzyma nazwę pliku, w destruktorze (~Obiekt) napisałem funkcję która usuwa plik związany z obiektem.
W uproszczeniu klasa wygląda tak:
public Obiekt(MemoryStream m)
{
this.fileName = LosowaNazwa() + (StatycznyLicznik ++);
SaveToDisc(m, this.fileName);
}
~Obiekt()
{
if (File.Exists(this.fileName))
File.Delete(this.FileName);
}
obiekty przechowuję w kolejce, a gdy chce usunąć pliki to po prostu usuwam obiekt z kolejki
Podczas działania programu okazało się że pliki są usuwane zanim je usunę z kolejki w losowym momencie - sprawdzałem pod debugerem i nie ma nigdzie usuwania tych obiektów z kolejki - pliki natomiast są usuwane
Dałem breakpoint na destruktor i okazuje się że ten jest wywoływany - nie mogę się dowiedzieć dlaczego bo stack nic nie wykazuje poza wątkiem garbage collectora
Czy jest możliwe że program przy przekazywaniu obiektu do różnych funkcji tworzy kopię obiektu, zamiast działać na oryginale i próbując pozbyć się tej kopii wywołuje destruktor który wskazuje na ten sam plik?
Jestem pewien że nie ma kolizji w nazwie pliku i że nie tworzę jednego obiektu dwa razy a także że nie usuwam ich nigdzie (cały czas istnieje twarda referencja w kolejce)
Próbowałem zmienić destruktor na IDisposable
i to rozwiązało problem - pliki nie znikają kiedy nie powinny; ale tu z kolei zostają zbyt długo - metoda Dispose wydaje się nie być wywoływana za każdym razem, lub jej wywołanie jest bardzo opóźnione - nie jest również wykonywana przed wyłączeniem na siłę programu w związku z czym na dysku twardym zalegają niepotrzebne pliki