c# Perdita di memoria del controllo dell'immagine WPF




.net memory leak (3)

Dovresti bloccare queste immagini e impostare la loro larghezza (o altezza) che verrà effettivamente utilizzata nell'applicazione, se possibile:

// ...
bitmap.DecodePixelWidth = 64; // "displayed" width, this improves memory usage
bitmap.EndInit();

bitmap.Freeze();
this.images[pageNumber].Source = bitmap;

Il mio programma ha un sacco di piccole immagini (i controlli di immagine sono piccoli, non le immagini stesse) e dicendo molto intendo più di 500. Queste immagini sono generate in modo asincrono e quindi assegnate ai controlli Image , che sono stati inizializzati in precedenza.
Fondamentalmente il mio codice fa quanto segue:

            filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, string.Format("{0}.JPG", Guid.NewGuid().GetHashCode().ToString("x2")));
            converter.ConvertPdfPageToImage(filename, i);
            //Fire the ThumbnailCreated event
            onThumbnailCreated(filename, (i - 1));  

Non c'è perdita di memoria nel codice che crea le immagini, ho il seguente codice:

            string[] files = Directory.GetFiles("C:\\Users\\Daniel\\Pictures", "*.jpg");
            for(int i=0; i<files.Length; i++){
                onThumbnailCreated(files[i], i);
            } 

Ancora il problema persiste. Questo succede nel metodo del gestore di eventi:

    void Thumbnails_ThumbnailCreated(ThumbnailCreatedEventArgs e, object sender)
    {
        //Since we generate the images async, we need to use Invoke
        this.parent.Dispatcher.Invoke(new SetImageDelegate(SetImage), e.Filename, e.PageNumber);
    }

    private void SetImage(string filename, int pageNumber)
    {
        BitmapImage bitmap = new BitmapImage();
        bitmap.BeginInit();
        //I am trying to make the Image control use as less memory as possible
        //so I prevent caching
        bitmap.CacheOption = BitmapCacheOption.None;
        bitmap.UriSource = new Uri(filename);
        bitmap.EndInit();
        //We set the bitmap as the source for the Image control
        //and show it to the user
        this.images[pageNumber].Source = bitmap;
    }

Con 468 immagini, il programma utilizza circa 1 Gb di memoria e quindi ne esce completamente. Il mio compito è persino possibile ottenere usando WPF o il numero di immagini è troppo alto? Forse c'è qualcosa di sbagliato nel mio codice?
Grazie in anticipo



Answer #2

Prova questo:

private void SetImage(string filename, int pageNumber)
{
    using (BitmapImage bitmap = new BitmapImage())
    {
        bitmap.BeginInit();
        //I am trying to make the Image control use as less memory as possible
        //so I prevent caching
        bitmap.CacheOption = BitmapCacheOption.None;
        bitmap.UriSource = new Uri(filename);
        bitmap.EndInit();
        this.images[pageNumber].Source = bitmap;
    }
}

Questo eliminerà le tue bitmap quando avrai finito con loro.







memory-leaks