私は過去に非常によく似た質問がここで行われたことを知っていますが、どちらも私の問題の解決策を持っていませんでした:
画像をメモリからBitmapImageにロードします。
private static BitmapImage LoadImage(byte[] imageData)
{
if (imageData == null || imageData.Length == 0) return null;
var image = new BitmapImage();
using (var mem = new MemoryStream(imageData))
{
mem.Position = 0;
image.BeginInit();
image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = null;
image.StreamSource = mem;
image.EndInit();
}
image.Freeze();
return image;
}
次に、これを(INotifyPropertyChangeを使用して)使用して、結果のBitmapImageを(ページ上の)Imageオブジェクトのソースにバインドします。
問題は次のとおりです。これによりメモリリークが発生します(私の場合、2〜3枚の画像で最大300MBです!)
プロファイラーを使用してもこれを見つけることはできません-.netメモリプロファイラーだけが私を軌道に乗せました(すべてのバイトが移動するアンマネージメモリにあるため-ANTSは「.NETは合計367,3MBのプライベートのうち19,24MBを使用していますアプリケーションに割り当てられたバイト数"-nice):
私が何をしようとも、私はこの漏れを逃がしません。試してみました(単一および一度にすべて):
- ビジュアルツリーをクリアする/アンロード時に画像を削除する
- Image-Sourceをnullに設定します
- Imageの代わりにRectangleでImageBrushを使用する
- MemoryStreamを破棄せずに他のCacheOptions
- 画像をフリーズしないでください
私はこれを取得しません-本当に!ソースでの画像の使用をやめるとすぐに、すべて問題ありません(リークはありません)。
誰か私が試すことができるオプションはありますか?
備考 これはまったくバグではないようです(私の2番目のコメントを参照)-これをチェックする必要があるので、今は質問を開いておきます-おそらくこれはこれに関する他の質問にも役立つかもしれません