###前提・実現したいこと
WPFでPNGファイルを読み込み、加工した後でPNGファイルに書き込むプログラムを作成しています。
メモリーリーク(1.2Gbyte)がどうしても取れないため、ご教授をお願いします。
###発生している問題・エラーメッセージ
renderBitmap.Render(tempCanvas) 実行時に大量に消費するメモリを、GCで解放できない。
###該当のソースコード
void func() { FileStream rfs = new FileStream("test.png", FileMode.Open); //10000x10000のPNGファイル Image image = new Image() { Source = BitmapFrame.Create(rfs) }; image.Source.Freeze(); Canvas tempCanvas = new Canvas() {Width = 10000, Height = 10000 }; Size size = new Size(10000, 10000); Canvas.SetLeft(image, 0); Canvas.SetTop(image, 0); Canvas.SetZIndex(image, 1); tempCanvas.Children.Add(image); tempCanvas.Measure(size); tempCanvas.Arrange(new Rect(size)); RenderTargetBitmap renderBitmap = new RenderTargetBitmap( (int)size.Width, (int)size.Height, 96.0d, 96.0d, PixelFormats.Pbgra32 ); renderBitmap.Render(tempCanvas); renderBitmap.Freeze(); using (FileStream wfs = new FileStream("Test2.png", FileMode.Create)) { BitmapEncoder encoder = new PngBitmapEncoder(); try { encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); encoder.Save(wfs); } catch { } } image = null; tempCanvas = null; renderBitmap = null; // Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.SystemIdle); // Dispatcher.Run(); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); }
###試したこと
Freeze()や、null等の参照を消す処理を入れてみたのですが効果はありませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
WPF
.net freamework4
C#
Windows8.1
Visual Studio 2013 pro
※上記ソースコードはusingの追加とファイルを用意していただければ、コピペで動作します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/07 00:15