スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

添付プロパティの注意点

MVVMパターンで、イベントをどうにかしよう。
等々で、添付プロパティを使ってきたけれども、一部実装をめんどくさくて書いていないところがある。それは、バインディングの解除(削除)を実行するコードだ。書いてはいないけれども、仕事(開発)上では非常に重要なので、メモをしておく。
データバインディングを削除するには、BindingOperationsクラスのClearBindingメソッドが使われる。BindingOperationsクラスは、System.Windows.Data名前空間にある。なぜ、削除が必要か?それはメモリリークの元になる危険性があるからだ。添付プロパティの値変更イベント内で登録したイベントハンドラはもっとあからさまにリークの元になる。
イベントにハンドラ用メソッドを登録すると、明示的に削除しない限り、そのハンドラ用メソッドがそのコントロールを参照し続ける事になる。「参照し続ける」という事は、たとえ画面が終了して、GC(ガベージコレクト)が発生しても回収されない事を意味する。1回や小さい画面ならまだしも、数十個の綱目を持つ登録画面や、十数個、数千件の一欄を表示する検索画面等がリークすると、1回の起動あたりで20MByteくらいずつ増えていく事になる。
では、どうするか?
・画面終了時にかならず登録したイベントからハンドラメソッドを削除する。
・少なくともSetBinding等でバインドしたプロパティは、画面終了時にバインディングを削除しておく。
・CommandBinding等も同じ。Addすれば、画面終了時はかならずRemoveする。
リークに関する記事があったので貼っておく。
参考URL:
Finding Memory Leaks in WPF-based applications
.NET3.5時代の記事ではあるけど、おそらくWPF4にも同じ事が言えると思う。上の記事では、TextBlockのTextPropertyは必ずClearBindinしておけと書いてある。そうなのかと思い余って、いつインスタンスが不要になるかわからないDataGrid内で使われるTextBlockに、ClearBindingを実行する添付プロパティをつけて、余計にメモリリークしたのは、苦い思い出だ。
何にせよ、イベントや添付プロパティは放ったらかしにしても、問題ないような顔をしているけど、裏ではしっかりリークしている事があると思った方が良いという事かな。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。