191 votes

Pourquoi et comment éviter les fuites de mémoire des gestionnaires d'événements ?

Je viens de me rendre compte, en lisant certaines questions et réponses sur StackOverflow, que l'ajout de gestionnaires d'événements à l'aide de l'option += en C# (ou, je suppose, dans d'autres langages .net) peut provoquer des fuites de mémoire courantes...

J'ai souvent utilisé des gestionnaires d'événements de ce type dans le passé, sans me rendre compte qu'ils pouvaient provoquer, ou ont provoqué, des fuites de mémoire dans mes applications.

Comment cela fonctionne-t-il (c'est-à-dire, pourquoi cela provoque-t-il une fuite de mémoire) ?
Comment puis-je résoudre ce problème ? Est-ce que l'utilisation de -= au même gestionnaire d'événement ?
Existe-t-il des modèles de conception communs ou des meilleures pratiques pour gérer des situations de ce type ?
Exemple : Comment suis-je censé gérer une application qui comporte de nombreux threads différents, utilisant de nombreux gestionnaires d'événements différents pour déclencher plusieurs événements sur l'interface utilisateur ?

Existe-t-il des moyens simples et efficaces de contrôler ce processus dans une grande application déjà construite ?

0voto

MizRaeL Points 177

Je peux vous dire que cela pourrait éventuellement devenir un problème dans Blazor. Vous pouvez avoir un composant qui s'abonne à des événements en utilisant la fonction += syntaxe et à long terme, cela provoquera des fuites.

La seule solution à ce problème (à ma connaissance) est de ne pas utiliser de méthodes anonymes, de faire en sorte que le composant hérite de IDisposable et utilise Dispose() pour désinscrire le gestionnaire d'événements.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X