2009-06-30 12 views
53

Jeśli mam aplikację zarejestrowaną tylko z kilkoma procedurami obsługi zdarzeń (a obiekty wykorzystujące te zdarzenia nie są usuwane do czasu zamknięcia aplikacji), czy naprawdę muszę się martwić o wyrejestrowanie tych programów obsługi? Jedynym dobrym powodem, dla którego mogłem się przekonać, jest to, że w przypadku wystrzelenia zdarzeń może wystąpić dodatkowy problem, który nie wymaga szczególnej uwagi (tzn. Masz wiele programów obsługi zarejestrowanych w jednym wydarzeniu). Czy jest jakikolwiek inny dobry powód? Ktoś napotkał na poważne problemy, ponieważ nie wyrejestrowywał wydarzeń?Czy nie można wyrejestrować programów obsługi zdarzeń?

Odpowiedz

68

Jeśli masz A publikowanie zdarzenie, a B subskrypcji zdarzenia (handler), to jest to tylko problem nie zrezygnować jeśli A będzie żyć o wiele dłużej niż B. Zasadniczo, subskrypcja zdarzenia oznacza, że ​​A nadal może widzieć B, więc uniemożliwiłoby to gromadzenie śmieci i nadal wywoływałoby zdarzenia, nawet jeśli o nim zapomniałeś (i być może Disposed()).

Na przykład, jest to problem, jeśli A jest statyczną wydarzenie, a aplikacja działa przez jakiś czas po B umiera ...

Ważne jest, aby pamiętać, można by zapytać, co następuje:

Jeśli B żyje dużo dłużej niż A, czy B nie będzie zbierał śmieci?

A odpowiedź brzmi "nie". B nie ma odniesienia do A przez zdarzenie; A zostanie odebrany jako zwykły

+0

Jest to szczególnie złe, jeśli B jest zasobem ciężkim ... –

+0

Wielki wgląd Marc. procedury obsługi zdarzeń statycznych są bardzo głośne, jeśli nie są traktowane podczas usuwania subskrybenta. – TheVillageIdiot

+3

Wiem, że to stary post i nie wiem, czy kiedykolwiek zostanie odczytany, ale jeśli B będzie trwać dłużej niż A, czy B nie będzie zbierał śmieci? –

14

Wiele osób uważa, że ​​ważne jest, aby zrezygnować z subskrypcji, jeśli wydawca przeżyje subskrybenta. Nie podoba mi się to podejście. Abonent zdarzenia, który nie odłącza się od wydawcy, tworzy nieprzyjemne zależności od zachowania podmiotów spoza wydawcy i subskrybenta. Jeśli odwołanie do wydawcy będzie trwało dłużej niż oczekiwano, to utrzyma on przy życiu abonenta, wraz z wszelkimi obiektami, do których abonent odwołuje się. Jeśli duża liczba porzuconych obiektów jest połączona ze sobą przez procedury obsługi zdarzeń, ale żadne z nich nie ma odwołania do żywych obiektów, wszystkie obiekty mogą zostać przesłonięte przez garbage collector. Jeśli jednak ktoś niespodziewanie zachowuje odniesienie do jednego z obiektów, może to uniemożliwić zbieranie śmieci.

IMHO, znacznie lepiej jest być aktywnym w usuwaniu programów obsługi zdarzeń, niż porzucać je i mieć nadzieję, że wszystko zostanie oczyszczone. Jeśli nie można mieć pewności, że nie mogą istnieć żadne nieoczekiwane odniesienia do wydawcy, takie podejście prawdopodobnie "w większości" zadziała, ale spowoduje sporadyczne wycieki pamięci.

Powiązane problemy