3

複数の大きな画像を動的にダウンロードして保持するピボットを作成しました。最初に webclient を使用してイメージをダウンロードし、ディスクに書き込みます。すべての画像を保持する画像リストの配列を作成するよりも。基本的な考え方は、必要なときにのみ画像をロードすることです。リストに 12 枚の画像があるとします。ピボットは、スライドごとに 1 つの画像のみを表示しています。画像 7 を見ていると仮定します。次のスライド用に画像 6 と 8 をプリロードします。

1, 2, 3, 4, 5, [6, {7}, 8], 9, 10, 11, 12

ユーザーがスライドをナビゲートするとき、私は画像を「[]」の間にプリロードし、外側にアンロードします。

画像をプリロードするために使用したコード:

BitmapImage bi = new BitmapImage();
bi.SetSource(GetStream(fileName);
IMGSource = bi; // IMGSource<ImageSource> referenced by the xaml in Image Binding IMGSource.

画像をアンロードするために使用したコード:

IMGSource = null;
GC.Collect(); // I force the program to Garbage collect since the image is really large.

問題は、いくつかの画像が表示された後(約9枚の画像)です。次の行で OutOfMemory 例外をスローしますbi.SetSource

アンロード機能が正常に動作することを確認しました(Collectを呼び出した後にメモリを解放し、メモリは安定したポイントに保持されました)

しかし、それでもOutOfMemory例外がスローされます。私は何をすべきか?

編集: スライドをナビゲートするとき
に実際にメモリが増え続けることを発見しました。
次のように呼び出します。

Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage;

それは次のような思い出を与えます:

54.7 MB, 76.91 MB, 111.94 MB, 105 MB, 112.71 MB, 141.93 MB, 148.42 MB, Exception thrown

しかし、呼び出すことによって:

GC.GetTotalMemory(false);

周りを見せている1.2~1.3 MBだけです。
どうしたの?メモリが解放されるべきではありませんか?

4

1 に答える 1

1

最終的に、空の 1x1 透明 GIF を画像ソースに設定して、メモリを解放します。

public static byte[] EMPTY_IMAGE = new byte[]{
    71, 73, 70, 56, 57, 97, 1, 0, 1
    , 0, 128, 0, 0, 255, 255, 255
    , 0, 0, 0, 33, 249, 4, 1, 0, 0
    , 0, 0, 44, 0, 0, 0, 0, 1, 0, 1
    , 0, 0, 2, 2, 68, 1, 0, 59
};

そして、次を使用します。

bi.SetSource(new System.IO.MemoryStream(MYCLASS.EMPTY_IMAGE));

そして、メモリは適切に解放されているようです。

于 2013-02-17T09:11:21.077 に答える