複数の大きな画像を動的にダウンロードして保持するピボットを作成しました。最初に 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
だけです。
どうしたの?メモリが解放されるべきではありませんか?