[IEnumerable] libérer les ressources

Signaler
Messages postés
6
Date d'inscription
jeudi 17 juillet 2008
Statut
Membre
Dernière intervention
24 mai 2010
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour la communauté,

Je me permets de vous écrire car j'aurais besoin d'une petit conseil. J'utilise actellement dans un forme un usercontrol custom qu'un collègue à coder (pour afficher des images collectées depuis une webcam). Le problème est que lorsque je récupère les données issues de la webcam pour les passer au control, il les stocke dans un objet IEnumerable (moi je lui retourne sous forme de List).

Voici à quoi ressemble le code :
/**
 * Code du usercontrol
 */
private IEnumerable _bitmapList;
public IEnumerable BitmapList
get {return _bitmapList;}
set {_bitmapList = value;}
...
/**
 * Fin du usercontrol
 */

/**
 * Code de mon formulaire
 */
imageUserControl1.BitmapList = BitmapCollection; // J'ajoute une liste de Bitmap qui seront afficher.
...
imageUserControl1.BitmapList = new List(); // Met à jour la liste pour la "vider"


Le problème est que la liste est bien vide quand je l'affiche mais la mémoire n'est pas libérée.
J'ai essayer plusieurs méthode qui ne fonctionne pas :
- utiliser la méthode dispose => libère la mémoire du control mais pas les image sur lesquelles pointe _bitmapList (et donc impossible de libérer la mémoire).
imageUserControl.BitmapList.Dispose();

- Parcourir la liste et appeller la méthode dispose sur tous les éléments de la liste => semble n'avoir aucun effet.
foreach(Image i in imageUserControl.BitmapList)
    i.Dispose();

- "vider" la liste (la faire pointer vers une nouvelle liste vide) et appeller le garbage collector manuellement => pareil, semble n'avoir aucun effet.
imageUserControl.BitmapList = new List();
GC.Collect();


Etant donné que je suis débutant en csharp, je suis a cours d'idée (toutes celles que j'ai précitée, je les ai trouvé sur Internet et notamment sur le forum CsharpFR.com).

Si quelqu'un a une idée, je suis preneur. En attendant, je continu mes recherches.

1 réponse

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Bonjour,

Appeler Dispose sur chaque instance de la classe Image et vider la liste (pour ne plus avoir de référence à ces instances) est suffisant.
Si ces images ne sont pas référencées ailleurs (et dans ce cas là, il ne faut sans doute pas appeler Dispose sur les instances), le GC fera le ménage en temps voulu.
De manière générale il est déconseillé de forcer soit même le GC a entrer en action.

/*
coq
MVP Visual C#
CoqBlog
*/