Bonjour,
Je met ce message ici, ne sachant pas où le mettre ailleurs. Je pense qu'il sera déplacé.
Je voulais simplement faire part de quelque chose que j'ai constaté en cherchant de régler un problème de mémoire grandissante dans mon application.
Pour certaines raisons, j'ai des classes abstraites dans mon application, avec des méthodes statiques. Jusque là tout va bien. Dans certaines de ces classes, j'ai des évènements statiques, que je lance afin que toutes les autres classes de mon application qui y sont abonnées puissent faire des traitements. Exemple:
J'ai une classe "MyApplicationFiles" qui a un évènement statique "FileChanged" qui est lancé à chaque fois qu'un fichier traité par l'application change.
A présent j'ai un formulaire (Form1) qui affiche tous les fichiers de l'applcation (dans une ListView). Il faut que la liste se mette à jour si le nom de l'un des fichiers change, même si il change depuis un autre formulaire que celui-ci (FormX).
Alors le formulaire (Form1) est abonnée à l'évènement "FileChanged" et la listview se met à jour dans le Handler quand l'évènement est lancé. Donc dans l'autre formulaire (FormX), lorsqu'un fichier est renpmmé, le formulaire lance l'évènement statique FileChanged afin de notifier à toutes les formes abonnées (Form1, ...) de se mettre à jour.
Cela fonctionne bien, mais il y a un problème au niveau de la mémoire: Form1 n'est jamais libérées par le garbage collector.
En effet, lors du chargement de la forme, elle s'abonne à l'évènement statique:
Tout se passe bien. Mais à la fermeture de la forme, elle reste en mémoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 private void Form1_Load() { MyApplicationFiles.FileChanged += new EventHandler(MyApplicationFiles_FileChanged ); }
Pour corriger le problème, il faut absolument se désabonner de l'évènement lors de la libération des ressources de la forme, par exemple dans la méthode Dispose():
La forme n'a plus de lien avec la classe statique et le garbage collector peut faire son travail et libérer la forme de la mémoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 protected override void Dispose( bool disposing ) { MyApplicationFiles.FileChanged -= new EventHandler(MyApplicationFiles_FileChanged ); if( disposing ) { this.imlIcones.Images.Clear() ; this.imlIcones = null ; if( components != null ) components.Dispose(); } base.Dispose( disposing ); }
Peut-être qu'il existe un autre moyen, peut-être que j'ai fait quelque-chose de faux, si c'est le cas, merci de me corriger, mais je voulais néanmoins faire part de mon problème afin d'aider d'autres personnes qui pourraient avoir besoin de faire de même.
Partager