CreateOptionsがDelayCreationであり、ビジュアルツリー(ImageまたはImageBrushのいずれか)に配置されている場合、BitmapImageはメモリリークを起こします
SDK 7.1を搭載したエミュレーターと電話(HTC Titan)でこれが表示されます手順:
- 新しいWPプロジェクトを開く
- App.xaml.csで新しいディスパッチャータイマーを起動します。このディスパッチャータイマーは、メモリ使用量(DeviceStatus)を毎秒出力し、GC.Collect()を実行します。((MemoryUsageLimit-CurrentMemoryUsage)より少し小さいサイズで計算されたバイト配列を更新することを検討してください)
- ContentPanel内にImagePanelという名前のStackPanelを追加します
- ContentPanelに2つのボタンを追加します(1つはコードを使用してImagePanelに10個の画像を作成および追加するためのもので、もう1つはImagePanelの子をクリアするためのものです)
- 高解像度の画像を見つけて(メモリ使用量が簡単にわかるように)、ローカルIISでホストします
ボタン1がクリックされたら、書き込み:
Random rand = new Random(); for(int i=0 ; i<10 ; i++) { //use 192.168.55.100 instead of localhost when running on the phone //to be able to see traffic in fiddler.Change localhost to machinename for the emulator var uri = "http://localhost/images/bigimage.jpg?tc=" + rand.Next(Int32.MaxValue); var bitmap = new BitmapImage { UriSource = new Uri(uri, UriKind.RelativeOrAbsolute), CreateOptions = BackgroundCreation //or None or DelayCreation }; ImagePanel.Children.Add(new Image { Source = bitmap }); }
ボタン2がクリックされたら、書き込み:
ImagePanel.Children.Clear(); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
CreateOptionsのすべてのバリエーションを試して、メモリの違いを確認してください。要素の追加と削除を続け、OutOfMemoryExceptionを取得するCreateOptionを確認します。
誰かがこれを確認できますか?