Si une application avec seulement quelques gestionnaires d'événements est enregistrée (et que les objets utilisant les événements ne sont pas éliminés avant la fermeture de l'application), dois-je vraiment m'inquiéter de l'annulation de l'enregistrement de ces gestionnaires? La seule bonne raison pour laquelle je pourrais voir est qu'il pourrait y avoir un peu plus de frais supplémentaires si des événements sont déclenchés dont vous n'avez pas vraiment besoin (c'est-à-dire que vous avez plusieurs gestionnaires enregistrés pour un événement). Y a-t-il d'autres bonnes raisons? Quelqu'un a-t-il rencontré des problèmes majeurs parce qu'il n'a pas annulé les événements?Est-il mauvais de ne pas annuler l'inscription des gestionnaires d'événements?
Répondre
Si vous avez un événement A
la publication, et B
souscrivant à un événement (le gestionnaire), alors il est seulement un problème de ne pas résilier votre abonnement si A
va vivre beaucoup plus longtemps que B
. Fondamentalement, l'abonnement d'événement signifie que A
peut toujours voir B
, donc l'empêcherait d'être collecté de la saleté, et déclencherait toujours des événements même si vous l'avez oublié (et peut-être Disposed()
).
Par exemple, cela est un problème si A
est un événement statique, et votre application exécute pendant un certain temps après B
meurt ...
Il est important de noter, on peut poser les questions suivantes:
Si B vit beaucoup plus longtemps que A, B empêchera-t-il A d'être ramassé?
Et la réponse à cette question est "non". B n'a aucune référence à A à travers l'événement; Un sera collecté comme d'habitude
Beaucoup de gens semblent penser qu'il est important de se désabonner des événements si l'éditeur doit survivre à l'abonné. Je n'aime pas cette approche. Un abonné d'événement qui ne se détache pas de l'éditeur crée des dépendances désagréables sur le comportement des entités en dehors de l'éditeur et de l'abonné. Si une référence à l'éditeur est conservée plus longtemps que prévu, l'abonné restera en vie, ainsi que tous les objets auxquels l'abonné détient une référence. Si une grande masse d'objets abandonnés sont interconnectés par des gestionnaires d'événements, mais qu'aucune référence active n'existe pour aucun d'entre eux, tous les objets peuvent être balayés par le garbage collector. Si, toutefois, quelqu'un se trouve quelque part de manière inattendue dans une référence à l'un des objets, cela peut empêcher l'un d'entre eux d'être récupéré.
IMHO, il est préférable d'être proactif dans la suppression des gestionnaires d'événements que de les abandonner et d'espérer que tout est nettoyé. Sauf si l'on peut être certain qu'aucune référence inattendue à l'éditeur ne peut exister, une telle approche est susceptible de fonctionner «la plupart du temps», mais occasionne des fuites de mémoire occasionnelles.
- 1. Hudson annuler ne pas annuler tous les processus
- 2. Django transaction.commit_on_success ne pas annuler la transaction
- 3. Les gestionnaires d'événements jQuery ne tirent pas dans IE
- 4. Annuler événement jQuery manipulation
- 5. Suppression des gestionnaires d'événements
- 6. Tomcat ne pas annuler le déploiement d'un pot
- 7. Énumération des gestionnaires d'événements
- 8. Suppression des gestionnaires de l'élimination de l'objet
- 9. Partage de données entre des gestionnaires d'événements?
- 10. Liaison de plusieurs gestionnaires à des éléments
- 11. Unité de test des gestionnaires d'événements Flex
- 12. Annulation des mauvais changements avec svn dans Eclipse
- 13. Annuler le fichier ne se trouve pas dans un espace de travail en perforce
- 14. vraiment mauvais
- 15. Vérification de l'orthographe dans Aquamacs Emacs ne fonctionnera pas: "Mauvais ordre endian."
- 16. Annuler l'opération pour TFS?
- 17. Comment annuler l'annulation de l'enregistrement des dll COM initialement ajoutées à RegSvr32 lorsque l'argument/u ne fonctionne pas?
- 18. Utiliser ASP.NET AJAX UpdatePanel avec des gestionnaires
- 19. Gestionnaires de transactions multiples JPA
- 20. Différences dans l'affectation des gestionnaires d'événements C#?
- 21. annuler l'opération de construction
- 22. Annuler form.submit()
- 23. Roulette Java utilisant des gestionnaires de champs personnalisés
- 24. Safari mauvais cadres de rendu
- 25. Comment annuler un checkin dans bitkeeper qui ne fait pas partie d'un changeset?
- 26. Obtenir la liste des gestionnaires de tâches via SWT?
- 27. Gestionnaires d'événements jQuery
- 28. Unité de test des gestionnaires d'événements dans SharePoint?
- 29. nombre arbitraire de gestionnaires Loader anonymes avec des données individuelles?
- 30. Gestionnaires d'événements C#
Ceci est particulièrement mauvais si B est une ressource lourde ... –
Bonne idée Marc. Les gestionnaires pour les événements statiques sont vraiment notoires s'ils ne sont pas pris en charge lors de la disposition de l'abonné. – TheVillageIdiot
Je sais que c'est un vieux billet et je ne sais pas s'il sera lu, mais si B vit beaucoup plus longtemps que A, est-ce que B empêchera A d'être ramassé? –