WPF のメモリリーク
WPFアプリを丸一日動かしたら不明なエラーで終了とな・・・
メモリリークかな?やっぱり。
ちょうどいい記事を見つけたので紹介。
http://blogs.msdn.com/b/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx
ありうるとしたら
・イベントハンドラの不適切な使用
・データバインディングの不適切な使用
・BitmapImage起因のリーク
かな・・・
なるほど。
イベントハンドラのリーク
同じものにイベントハンドラで
Window1.w1.TextBox1.TextChanged += new TextChangedEventHandler(this.TextBox1_TextChanged);
みたいにしまくるとこのイベントが残り続けるらしい。
全部C#コード側で画面レイアウトを生成してるから、これが怪しいな。
ちなみに、これの回避策は
Window1.w1.TextBox1.TextChanged -= new TextChangedEventHandler(this.TextBox1_TextChanged);
とのこと。
BitmapImageのリーク
BitmapImageは、Imageのソース指定をする際に使用するもの。
Image.Sourceに指定すると、それが子要素として保持され続けるため、
gc対象にならない・・・と。
BitmapImage bitmap = new BitmapImage(new Uri("bitmap.bmp", Urikind.RelativeOrAbsolute)); //既にあるImageインスタンス this.image.Source = bitmap;
おい、画像切り替える度にBitmapImage生成してるぞ、俺・・・
ちなみに、解決法はBitmapImageをフリーズする事みたい。
BitmapImage bitmap = new BitmapImage(new Uri("bitmap.bmp", Urikind.RelativeOrAbsolute)); //フリーズ可能な場合にはフリーズする。 if(bitmap.CanFreeze){ bitmap.Freeze(); } //既にあるImageインスタンス this.image.Source = bitmap;
うーむ。良い感じにJavascriptの時の悪夢を思い出すな