To zbyt uproszczone założenie webform jest krótkotrwały - w tym przykładzie wyglądają dobrze, ale ogólnie należy być ostrożnym.
Właśnie dzisiaj, ja się na dobry przykład podobny do @thmsn gdzie brak unwire an obsługi zdarzeń w aplikacji ASP.NET WebForms było przyczyną paskudny wyciek pamięci.
W tym przypadku strona wzorcowa stosowane w prawie wszystkich stron było zapisanie się na razie w obiekcie To Page_Init. Obiekt, o którym mowa, był długotrwały i utrzymywał się w sesji ASP.NET, a strona została skonfigurowana do korzystania z magazynu sesji InProc z 60-minutowym limitem czasu. Nieodłączenie modułu obsługi zdarzeń spowodowało, że obiekt uniemożliwiał GC uzyskiwanie dostępu do wszystkich stronpodczas sesji tak długo, jak długo zachowywał (co najmniej przez godzinę w każdym przypadku).
Szybka korekta polegała na rozpinaniu programu obsługi zdarzeń w Page_Unload - ten przykład pokazuje, że okres istnienia strony można łatwo nieświadomie wydłużyć poza okres przydatności do użycia. Nie będę tu używał Sesji, chociaż daleko jej było do ideału - i widziałem podobne błędy z odsyłaczami wstecznymi z obiektów o odpowiednio dłuższym czasie życia.
uwzględniając procedurę obsługi zdarzenia nie przedłużyć żywotność obiektu z imprezy w jakikolwiek sposób, to przedłuża żywotność obiektu, który ma obsługi na jak długo obiekt ze zdarzeniem żyje, zatem opisaną sytuację nie jest możliwe. Obiekt, który musisz mieć, musi być zarówno odniesieniem do strony (a nie odwrotnie). – Servy
Proste literówki - subskrybowanie zdarzenia (nie obsługi) obiektu. Poprawione. I uwierz mi, mam dumpheap, żeby udowodnić przeciek! Pozdrawiam :) Subskrybowanie zdarzenia na obiekcie w sesji oznacza, że obiekt miał odniesienie do strony i utrzymywał ją przy życiu. –
Subskrybowanie obsługi zdarzeń do zdarzenia nie powoduje, że obiekt z obsługą ma odniesienie do obiektu, który zdefiniował zdarzenie. Mogłeś jawnie stworzyć takie odniesienie w twoim przypadku; Jest to dość łatwe do zrobienia, ale niekoniecznie musi się zdarzyć w wyniku subskrypcji zdarzenia, co oznacza, że rezygnacja z subskrypcji obsługi zdarzeń również nie spowodowałaby usunięcia problemu.Teraz, jeśli twoja strona zasubskrybowała program obsługi zdarzeń do jakiegoś innego obiektu, który był długo żywy, to * to * utrzymywałoby stronę tak długo, jak ten inny obiekt, ale to inna sytuacja. – Servy