2009-06-30 2 views
53

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

68

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

+0

Ceci est particulièrement mauvais si B est une ressource lourde ... –

+0

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

+3

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é? –

14

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.

Questions connexes