Czy to źle, aby nie wyrejestrować obsługi zdarzeń?

Jeśli mam aplikację z zarejestrowaną tylko kilkoma programami obsługi zdarzeń (a obiekty korzystające z tych programów nie są usuwane, dopóki aplikacja nie zostanie zamknięta), czy naprawdę muszę się martwić o wyrejestrowanie tych programów obsługi? Jedynym dobrym powodem, dla którego mogłem zobaczyć, jest to, że może być trochę dodatkowych kosztów, jeśli zdarzenia są zwolnione, że nie necessarly care about (TJ masz wiele obsługi zarejestrowanych do jednego zdarzenia). Jest jakiś inny dobry powód? Każdy napotkał poważne problemy, ponieważ nie zarejestrowali wydarzeń?

Author: SwDevMan81, 2009-06-30

2 answers

Jeśli masz A publikowanie wydarzenia i B subskrybowanie wydarzenia( obsługi), to jest tylko problem, aby nie zrezygnować z subskrypcji, jeśli A będzie żyć dużo dłużej niż B. Zasadniczo subskrypcja zdarzeń oznacza, że A może nadal widzieć B, więc zapobiegnie zbieraniu śmieci i nadal będzie uruchamiać zdarzenia, nawet jeśli o tym zapomnisz(i być może Disposed()).

Na przykład, jest to problem, jeśli {[0] } jest statycznym zdarzeniem, a Twoja aplikacja działa dla chwilę po śmierci B...

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

Jeśli B żyje dużo dłużej niż A, czy B uchroni A przed zbieraniem śmieci?

A odpowiedź brzmi "nie". B nie ma odniesienia do a poprzez Zdarzenie; a będzie zbierane jako normalne

 74
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-14 08:41:36

Wiele osób wydaje się myśleć, że ważne jest, aby wypisać się z wydarzeń, jeśli wydawca ma przetrwać subskrybenta. Nie podoba mi się to podejście. Subskrybent zdarzenia, który nie oddziela się od wydawcy, tworzy nieprzyjemne zależności od zachowania podmiotów spoza wydawcy i subskrybenta. Jeśli odsyłacz do Wydawcy jest przechowywany dłużej niż oczekiwano, utrzyma to Abonenta przy życiu, wraz z przedmiotami, do których Abonent posiada odsyłacz. Jeśli duża masa porzuconych obiektów jest połączona ze sobą przez procedury obsługi zdarzeń, ale nie istnieje żadne odniesienie na żywo do żadnego z nich, wszystkie obiekty mogą zostać zmiecione przez garbage collector. Jeśli jednak ktoś gdzieś niespodziewanie zachowa odniesienie do jednego z obiektów, może to uniemożliwić zbieranie śmieci.

IMHO, o wiele lepiej być proaktywnym w usuwaniu programów obsługi zdarzeń niż porzucać je i mieć nadzieję, że wszystko zostanie posprzątane. Chyba, że można być pewnym, że nie mogą istnieć nieoczekiwane odniesienia do wydawcy, takie podejście prawdopodobnie "w większości" zadziała, ale spowoduje sporadyczne wycieki pamięci.

 14
Author: supercat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-22 18:24:52