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
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
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.
- 1. Jak poprawnie wyrejestrować obsługi zdarzeń
- 2. Czy muszę anulować subskrypcję wszystkich programów do obsługi zdarzeń?
- 3. Przekazywanie danych zdarzeń do wbudowanych programów obsługi zdarzeń
- 4. Automatyczne tworzenie pustych programów obsługi zdarzeń w języku C#
- 5. Określenie listy programów obsługi zdarzeń związanych z zdarzeniem
- 6. Wyłączanie niektórych programów obsługi zdarzeń globalnych Ajax jQuery dla żądania
- 7. Delphi VCL for Win32 - wiele programów obsługi zdarzeń
- 8. Dodaj wiele programów obsługi zdarzeń dla jednego zdarzenia w XAML?
- 9. JavaScript: jak uzyskać listę programów obsługi zdarzeń związanych ze zdarzeniem
- 10. Nie znaleziono żadnych programów do obsługi rejestratora
- 11. Nie można znaleźć żadnych programów obsługi dla rejestratora "__main__"
- 12. Czy można wyrejestrować odwołanie w PHP?
- 13. Czy korzystanie z wbudowanych programów obsługi zdarzeń w HTML jest złym rozwiązaniem?
- 14. Czy muszę usunąć ten rodzaj obsługi zdarzeń?
- 15. dla obsługi zdarzeń
- 16. Opóźnianie obsługi zdarzeń do momentu wystrzelenia zdarzeń
- 17. IE8 onclick obsługi zdarzeń
- 18. Kontrola WebBrowser nie wyzwala procedur obsługi zdarzeń
- 19. Usuwanie obsługi zdarzeń
- 20. popstate obsługi zdarzeń wydaje się nie działać
- 21. Ręczne wywoływanie procedury obsługi zdarzeń
- 22. dostęp do obsługi zdarzeń
- 23. Jak usunąć obsługi zdarzeń lambda
- 24. Python - Nie znaleziono programów obsługi dla rejestratora "OpenGL.error"
- 25. C# usuwanie programu obsługi zdarzeń
- 26. Dziedziczenie obsługi zdarzeń w C#
- 27. Unit Testing Flex obsługi zdarzeń
- 28. Jak mogę wyrejestrować zestaw obsługi do funkcji jQuery.ajaxStart()?
- 29. Przekazywanie argumentów do obsługi zdarzeń
- 30. Moduł obsługi zdarzeń multiselect jquery
Jest to szczególnie złe, jeśli B jest zasobem ciężkim ... –
Wielki wgląd Marc. procedury obsługi zdarzeń statycznych są bardzo głośne, jeśli nie są traktowane podczas usuwania subskrybenta. – TheVillageIdiot
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? –