2

オブジェクトのコレクションがあり、各オブジェクトにはBitmapImageが含まれています。このコレクションをFlipViewにバインドしています。ユーザーがFlipViewでページをめくると、選択したオブジェクトのBitmapInmageがApplicationDataから読み込まれ、前のオブジェクトのBitmapImageをnullに設定して、メモリを解放します。問題は、メモリが解放されることはなく、アプリがしばらく反転した後にクラッシュすることです。コレクションを見ると、実際のアイテムだけにBitmapImageが設定されており、他のすべてのアイテムにはnullとして設定されています。では、どうすれば記憶を和らげることができますか?

画像を読み込む方法:

StorageFile s = await ApplicationData.Current.LocalFolder.GetFileAsync(localFilename);
BitmapImage bitmapImage = new BitmapImage();
using (var stream = await s.OpenAsync(FileAccessMode.Read))
{                    
    bitmapImage.SetSource(stream);
}                
return bitmapImage;

編集:問題は画像の読み込み方法にあると思います。ファイルストリームが解放されないと思います

4

5 に答える 5

1

Windows Phone 7 アプリケーションで同様の問題に遭遇しました。

私にとってうまくいったトリックの1つは、親要素から画像を削除することでした。

grid1.Children.Remove(image1);
image1 = null;

ただし、これがあなたの状況で役立つかどうかはわかりません。

この問題の詳細については、私のブログ投稿を参照してください。

于 2012-10-21T21:20:47.753 に答える
1

私にとってうまくいったのは、オブジェクト自体をnullに設定する前にUriSourceプロパティをnullに設定することでした。

于 2013-05-27T01:28:04.733 に答える
0

これらのイメージが大量のメモリを使用している場合は、ガベージ コレクションでメモリを解放することをお勧めします。これは、メモリへの強い参照をすべて削除した場合にのみ機能します。ガベージ コレクションを強制的に実行しすぎると、パフォーマンスの問題が発生する可能性があるため、これを試してみることをお勧めします。たとえば、いくつかの画像を「無効化」した後にのみコレクションを強制したい場合があります。

GC.Collect メソッドを使用してガベージ コレクションを強制できます。

http://msdn.microsoft.com/en-us/library/bb384155.aspx

于 2012-10-20T12:40:54.030 に答える
0

UWP で x:Bindings を使用している場合、同様の問題が発生する可能性がありますが、クラスをクリアした後に Bindings.Update() を実行すると (たとえば、画像がクラス内にあり、監視可能なコレクションに保持されているとします)、最初に実行します。その ObservableCollection で .Clear() を実行し、次に Bindings.Update() を実行すると、空き領域が回復することがわかります。

于 2016-02-19T11:58:03.330 に答える
-1

.net では、何かを null に設定しても何も起こりません。GC は無関係であり、選択したときに発生します。代わりに、画像が IDisposable を実装しているかどうかを確認してください。実装されている場合は、処理が終了したときに Dispose() を呼び出す必要があります。一般的には、「using」ステートメントを使用してこれを自動的に行います。

using(var img = GetImage()) {
    // todo: some stuff involving img
}
于 2012-10-20T12:42:54.997 に答える