1

CreateOptionsがDelayCreationであり、ビジュアルツリー(ImageまたはImageBrushのいずれか)に配置されている場合、BitmapImageはメモリリークを起こします

SDK 7.1を搭載したエミュレーターと電話(HTC Titan)でこれが表示されます手順:

  1. 新しいWPプロジェクトを開く
  2. App.xaml.csで新しいディスパッチャータイマーを起動します。このディスパッチャータイマーは、メモリ使用量(DeviceStatus)を毎秒出力し、GC.Collect()を実行します。((MemoryUsageLimit-CurrentMemoryUsage)より少し小さいサイズで計算されたバイト配列を更新することを検討してください)
  3. ContentPanel内にImagePanelという名前のStackPanelを追加します
  4. ContentPanelに2つのボタンを追加します(1つはコードを使用してImagePanelに10個の画像を作成および追加するためのもので、もう1つはImagePanelの子をクリアするためのものです)
  5. 高解像度の画像を見つけて(メモリ使用量が簡単にわかるように)、ローカルIISでホストします
  6. ボタン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 });
    }
    
  7. ボタン2がクリックされたら、書き込み:

    ImagePanel.Children.Clear();
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    

CreateOptionsのすべてのバリエーションを試して、メモリの違いを確認してください。要素の追加と削除を続け、OutOfMemoryExceptionを取得するCreateOptionを確認します。

誰かがこれを確認できますか?

4

1 に答える 1

0

BitmapImageはGDI+に依存しているため、この予想される動作ではありませんか?(したがって、本質的にアンマネージコードですか?)IIRC ImagePanelのリークではなく、BitmapImageが何度も作成されています。

同じBitmapImageオブジェクトに値を割り当てても、問題は発生しません。描画スレッドでこれを行う必要がありますが、そうでない場合はGDIが適合します)個人的には、WP7で画像を操作するときは常に、ネイティブクラスの代わりにImageToolsを使用します。出力は画像コントロールに直接割り当てることができますが、非同期でロードでき、使用するメモリが少なく、操作がはるかに高速です

于 2012-04-23T14:13:28.500 に答える