5

私のプログラムにはたくさんの小さな画像があります (画像コントロールは画像自体ではなく小さいものです)。たくさん言うと、500 以上を意味します。これらの画像は非同期的に生成され、Image以前に初期化されたコントロールに割り当てられます。
基本的に私のコードは次のことを行います:

            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));  

画像を作成するコードにメモリ リークはありません。次のコードがあります。

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

それでも問題は解決しません。これは、イベント ハンドラー メソッドで発生します。

    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;
    }

468 個のイメージを使用すると、プログラムは約 1Gb のメモリを使用し、それを使い果たしてしまいます。私の仕事は WPF を使用して達成することさえ可能ですか、それとも画像の数が多すぎますか? 多分私のコードに何か問題がありますか?
前もって感謝します

4

3 に答える 3

4

これらの画像をフリーズし、可能であればアプリケーションで実際に使用される幅 (または高さ)に設定する必要があります。

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

bitmap.Freeze();
this.images[pageNumber].Source = bitmap;
于 2012-11-28T17:59:21.920 に答える
-4

これを試して:

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;
    }
}

ビットマップを使い終わったら、ビットマップを破棄します。

于 2012-11-28T17:58:25.157 に答える
-4

メモリ リークの原因はイベント ハンドラである可能性があります。

このSOの質問を参照してください:

イベントハンドラのメモリリークを回避する理由と方法は?

于 2012-11-28T18:15:01.347 に答える