2011-06-20 8 views
5

Biorąc pod uwagę, że wszystkie kontrole w WebForm są zniszczone (przez mojego zrozumienia) na końcu każdego odświeżenie zrobić trzeba „unwire” żadnych obsługi zdarzeń mogą mieć okablowany? (Zakładając, że chcesz zatrzymać obsługi zdarzeń i pozwalają GC)Czy trzeba „unwire” obsługi zdarzeń w ASP.NET WebForms

Tak na przykład:

public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Do I need to remove this handler? 
     btnSubmit.ServerClick += btnSubmit_ServerClick; 
    } 
} 

Odpowiedz

3

Mało prawdopodobne. Twój okres istnienia instancji WebForm1 kończy się tuż po zdarzeniu Unload, jeśli dobrze pamiętam. To nie jest tak, że po wyświetleniu strony i po zakończeniu czyszczenia istnieje ciągłe odwołanie do klasy WebForm1.

2

Nie, nie trzeba. Będą zebrane śmieci.

0

udało mi się złożyć aplikacji internetowych (Webform) raz z dynamicznych kontroli, musiałem „unwire” moje wydarzenia, w przeciwnym razie strona stała się coraz wolniej. "stare" strony, o których myślałem, że GC zadbał, były wciąż w pobliżu. Kiedy rozpakowałem wydarzenie w Page_Unload mojej aplikacji, nie było już gromadzone wydarzenie dla nieistniejących stron.

To zdarzyło mi się tylko raz, a było to prawdopodobnie spowodowane dynamicznym charakterem aplikacji.

Tylko do myślenia :)

0

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.

+0

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

+0

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. –

+0

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

Powiązane problemy