Właśnie natknąłem się na niektóre kod, który używa metody GC.KeepAlive()
i staram się zrozumieć, jak to działa. Na przykład w ten kod:W jaki sposób metoda KeepAlive Garbage Collector działa z timerem?
Timer timer = new System.Timers.Timer(5000);
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timer.Enabled = true;
GC.KeepAlive(timer);
W tym kodzie mój zrozumienia jest to, że obiekt Timer jest tworzony, który spawns wątek, który kursuje co 5 sekund. Następnie uruchamiana jest linia GC. Następnie metoda kończy działanie, niszcząc licznik czasu, gdy działa usuwanie śmieci.
KeepAlive utrzymuje go przy życiu tylko przed wywołaniem KeepAlive, co dla mnie wygląda na około 0,0000001 sekund i nie zostanie tam zniszczony, ponieważ istnieje lokalne odniesienie do niego (chyba że go niszczy, ponieważ nic indziej dzieje się z obiektem z timerem?)
Tak czy inaczej, zanim trafi 5000, metoda zakończy się wieki temu i bardzo prawdopodobne jest, że zegar zostanie zniszczony. Jaki jest cel tej linii?
Zapytaj oryginalnego programistę? – dtb
Tak długo, jak masz do czynienia z kodem zarządzanym (tj. W całości z .Net), nie ma potrzeby używania 'GC.KeepAlive'. Wszystko, co robi, to zachować odniesienie do obiektu licznika czasu, aby nie zostały zebrane śmieci. [Dokumenty] (http://msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx) twierdzą, że naprawdę jest przeznaczony do użytku z obiektami przydzielonymi w zarządzanym kodzie, które są przekazywane do niezarządzanego kodu (np. wywołanie Win32 API). Tak więc dla tego konkretnego przykładu wydaje się to bezcelowe. – ThatBlairGuy
Niestety pierwotny programista dawno już minął i zostawił mi to piękno projektu do utrzymania :) – NibblyPig