2010-10-12 31 views
1

J'ai un ImageList qui est peuplé, bien vous l'avez deviné, des images. Ces images sont chargées en mémoire dans un jeu de données sous la forme Bitmap. Jusqu'à ce que je les charge dans le ImageList l'augmentation de la mémoire ne vous inquiétez pas. Mais quand ils sont ajoutés aux ImageList les fusées de ciel d'utilisation de mémoire. Mais le plus gros problème est quand je dois recharger la liste des images. J'ai essayé d'appeler disposer sur chaque image de la liste mais la mémoire n'est pas libérée. Ce est le code que j'essayé de nettoyer la mémoire:Problèmes de mémoire avec winforms ImageList

 foreach (Image item in imageList.Images) 
     { 
      item.Dispose(); 

     } 
     imageList.Images.Clear(); 

     GC.Collect(); 

Qu'est-ce que je fais mal?

Répondre

5

Votre code de disposition n'est pas approprié. L'itération de la collection Images en réalité crée un nouveau bitmap pour chaque image. Lequel vous disposez ensuite immédiatement. Appelez simplement Clear().

GC.Collect() ne peut pas avoir d'effet non plus, la classe ImageList est un wrapper autour du composant Windows natif. Qui stocke les images dans la mémoire native, pas la mémoire collectée garbage.

Dernier point, mais non des moindres, votre véritable problème: le gestionnaire de mémoire de Windows ne fonctionne tout simplement pas comme vous le pensez. Il ne pas réduire la taille de la mémoire virtuelle du programme lorsqu'il libère de la mémoire. Il marque simplement le bloc de mémoire comme inutilisé et l'ajoute à la liste des blocs libres. Prêt à être réutilisé plus tard. Seulement dans le cas très rare où la mémoire libérée couvre tout l'ensemble des pages de mémoire réservées, elle peut réduire la taille de la mémoire virtuelle. Ce n'est pas un vrai problème. C'est virtuel.

+0

Le cycle Dispose et l'appel GC.Colect ont été effectués dans une tentative de désespoir pour résoudre le problème, car le simple fait d'appeler Clear ne faisait pas l'affaire. – jpsstavares

+0

Le problème est que lorsque je remplis la liste une deuxième fois, je reçois une exception Out of memory si les listes sont trop grandes. C'est pourquoi je dis que la mémoire n'est pas libérée. – jpsstavares

+0

Disposez-vous les bitmaps après les avoir ajoutés à ImageList? –