2008-10-09 9 views
5

Tengo un ListBox con un montón de imágenes (hecho a través de una plantilla de datos). Las imágenes se crean mediante el establecimiento de la fuente artículos:Eliminar imagen en WPF en Listbox (pérdida de memoria)

<Image x:Name="ItemImage" Source="{Binding ImageUrl}"/> 

y luego se borran utilizando el método del cuadro de lista Items.Clear(). Las nuevas imágenes se agregan usando el método Items.Add del listbox.

Sin embargo, el uso de la memoria solo comienza a subir y hacia arriba y hacia arriba. Son las mismas 300 imágenes pequeñas que se muestran, pero la memoria nunca parece liberarse. La aplicación comienza a usar aproximadamente 40 Megas, y sube rápidamente a 700 Megas. ¿Cómo puedo liberar la memoria que están usando todas estas imágenes?

EDIT: Una cosa que olvidé mencionar, las imágenes (que son de aproximadamente 4-5k cada una en tamaño) se cargan a través de la red. ¿El almacenamiento en caché de alguna manera es responsable de esto? La visualización de 12 imágenes mastica aproximadamente 10 Megas de memoria, que tiene un tamaño de archivo de aproximadamente 100X.

Respuesta

4

A menos que esté haciendo algo inusual al cargar las imágenes (como el uso de cargadores de imágenes de fabricación casera o algo así), el GC debería eliminarlas cuando ya no haya nada que las haga referencia.

¿Está aferrado a referencias de datos en cualquier lugar? Recuerde que los eventos y controladores de eventos a veces puede "engañar" al recolector de basura en el pensamiento de que un objeto está todavía en uso:

MyObject obj = new MyObject(); 
obj.TheEvent += new EventHandler(MyHandler); 
obj = null; 
// Now you might think that obj is set for collection but it 
// (probably - I don't have access to MS' .NET source code) isn't 
// since we're still listening to events from it. 

No estoy seguro si esto se aplica a usted, pero al menos ahí es donde me gustaría comprobar si eras tú

Además, si tiene acceso a un generador de perfiles, como AQ Time o similar, ejecutar su código puede darle algunos consejos.

También podría intentar y ver si hace alguna diferencia si carga imágenes desde el disco o desde recursos integrados en su conjunto.

4

¿Qué tal si no se usa toda esa memoria en primer lugar?

(Nota:. El párrafo siguiente código y se reproducen a partir this answer)

Parte del problema es que se está cargando la imagen completa en cada uno. Debe usar un IValueConverter para abrir cada imagen en un tamaño de miniatura estableciendo las propiedades DecodePixelWidth o DecodePixelHeight en el BitmapImage. He aquí un ejemplo que utilizo en uno de mis proyectos ...

class PathToThumbnailConverter : IValueConverter { 
    public int DecodeWidth { 
     get; 
     set; 
    } 

    public PathToThumbnailConverter() { 
     DecodeWidth = 200; 
    } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     var path = value as string; 

     if (!string.IsNullOrEmpty(path)) { 

      FileInfo info = new FileInfo(path); 

      if (info.Exists && info.Length > 0) { 
       BitmapImage bi = new BitmapImage(); 

       bi.BeginInit(); 
       bi.DecodePixelWidth = DecodeWidth; 
       bi.CacheOption = BitmapCacheOption.OnLoad; 
       bi.UriSource = new Uri(info.FullName); 
       bi.EndInit(); 

       return bi; 
      } 
     } 

     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     throw new NotImplementedException(); 
    } 

} 

También es posible que desee considerar IsAsync=True en su Binding de manera que el convertidor se llama en un subproceso en segundo plano.

+1

O mejor aún: utilice la miniatura incrustada si existe, por lo que ni siquiera necesita leer el archivo completo y cambiar su tamaño ... Lookup BitmapFrame.Thumbnail –

+0

@xyzzer: Es bueno saberlo. –

+0

El problema que vi es que a menudo vienen con marcos negros o blancos como parte de la miniatura, lo que no siempre se ve muy bien, supongo que es por eso que la mayoría de los navegadores de imágenes parecen construir sus propias tiendas de miniaturas. –