私はWPFには比較的新しいので、いくつかのことは私にとってはかなり外国語です。 1つは、Windowsフォームとは異なり、WPFコントロール階層はIDisposableをサポートしていません。 Windowsフォームでは、ユーザーコントロールが管理対象リソースを使用した場合、すべてのコントロールが実装したDisposeメソッドをオーバーライドすることで、リソースを簡単にクリーンアップすることができました。WPFユーザーコントロールの適切なクリーンアップ
WPFでは、その話は単純ではありません。
最初のテーマは、WPFコントロールに管理されていないリソースがないため、WPFでIDisposableが実装されていないことを明示しています。それは事実かもしれませんが、WPFクラス階層へのユーザー拡張が本当に管理されたリソースを(直接的または間接的にモデルを通じて)使用するかもしれないという事実を完全に見逃したようです。 IDisposableを実装しないことにより、Microsoftは、カスタムWPFコントロールまたはウィンドウで使用されるアンマネージリソースをクリーンアップできる唯一の保証されたメカニズムを効果的に削除しました。
次に、Dispatcher.ShutdownStartedへの参照がいくつか見つかりました。 ShutdownStartedイベントを使用しようとしましたが、すべてのコントロールで起動するようには見えません。私はShutdownStarted用のハンドラを実装したWPF UserControlの束を持っていて、決して呼び出されません。私はそれがWindows、またはおそらくWPF Appクラスのためにのみ動作するかどうかはわかりません。しかし、それは適切に発射されていない、私は開いているPerformanceCounterのオブジェクトは、アプリケーションが終了するたびに漏れている。
Dispatcher.ShutdownStartedイベントよりもアンマネージリソースをクリーンアップする方がよいでしょうか? Disposeが呼び出されるようにIDisposableを実装するにはいくつかのトリックがありますか?可能であれば、ファイナライザを使用してを避けることをお勧めします。を避けてください。
コードビハインドから使い捨てリソースを移動するための+1。 WPFの重要な学習ポイントの1つは、データバインディングアーキテクチャの強みと表現力を活用するためにコードビハインドを最小限に抑えることです。学習するのは痛いことです(学習曲線は崖に登るようなものですが)WPFの考え方を「取得」するときには報酬を与えます。 –
すべての使い捨てリソースは実際にはViewModelにあり、それ自体はIDisposableです。 Dispatcher.ShutdownStartedイベントが発生していない理由について、私は本当に混乱しています。パフォーマンスカウンターコントロール(および関連するViewModel)は、のに埋め込まれているため、WPFグラフに実際に添付されています。 –
jrista
@Greg D:私は一般的にWPFモデルを取得します。私はWPFの基礎を習得するとすぐにMVVMを使い始めました。私のCodeBehindは、基本的なコンストラクタとInitializeComponentへの呼び出しという単純なものです。 WPFの合成機能とデータバインディング機能は素晴らしいものではありません。選択肢があれば、Windowsフォームに戻ることはありません。 – jrista