少し前に、WriteableBitmap メモリ リークに関連する質問を投稿しました。問題に関連する素晴らしいヒントを受け取りましたが、まだ深刻なバグがあると思います / (私のミス) / (混乱) / (その他のこと)ここ。
だから、ここに私の問題があります:
Image と Button を持つ WPF アプリケーションがあるとします。画像のソースは非常に大きなビットマップ (3600 * 4800 ピクセル) であり、実行時に表示されると、アプリケーションは最大 90 MB を消費します。
ここで、イメージのソース (非常に大きなイメージ) から WriteableBitmap をインスタンス化するとします。これが発生すると、アプリケーションは ~220 MB を消費します。
画像への変更(WriteableBitmapによる)が終了し、WriteableBitmapへのすべての参照(少なくとも私が知っているもの)が(メソッドの最後で、またはそれらを設定することによって)破棄されるとき、トリッキーな部分が来ますnull に) writeableBitmap によって使用されるメモリが解放され、アプリケーションの消費量が ~90 MB に戻るはずです。問題は、返される場合と返されない場合があることです。
サンプルコードは次のとおりです。
// The Image's source whas set previous to this event
private void buttonTest_Click(object sender, RoutedEventArgs e)
{
if (image.Source != null)
{
WriteableBitmap bitmap = new WriteableBitmap((BitmapSource)image.Source);
bitmap.Lock();
bitmap.Unlock();
//image.Source = null;
bitmap = null;
}
}
ご覧のとおり、参照はローカルであり、メソッドの最後 (またはガベージ コレクターがそうすることにしたとき) にメモリを解放する必要があります。ただし、アプリは宇宙の終わりまで最大 224 MB を消費する可能性があります。
どんな助けでも素晴らしいでしょう。