私はWPFに比較的慣れていないので、WPFに関するいくつかのことは私にとってまったく異質です。1つは、Windowsフォームとは異なり、WPFコントロール階層はIDisposableをサポートしていません。Windowsフォームでは、ユーザーコントロールが管理対象リソースを使用している場合、すべてのコントロールが実装しているDisposeメソッドをオーバーライドすることで、リソースを非常に簡単にクリーンアップできました。
WPFでは、話はそれほど単純ではありません。私はこれを数時間検索し、2つの基本的なテーマに遭遇しました。
最初のテーマは、WPFコントロールに管理されていないリソースがないため、WPFはIDisposableを実装しないことを明確に述べているMicrosoftです。それは事実かもしれませんが、WPFクラス階層へのユーザー拡張が実際に管理対象リソースを(モデルを介して直接的または間接的に)使用する可能性があるという事実を完全に見逃しているようです。IDisposableを実装しないことにより、Microsoftは、カスタムWPFコントロールまたはウィンドウによって使用される管理されていないリソースをクリーンアップできる唯一の保証されたメカニズムを効果的に削除しました。
次に、Dispatcher.ShutdownStartedへの参照がいくつか見つかりました。ShutdownStartedイベントを使用しようとしましたが、すべてのコントロールで起動するわけではないようです。ShutdownStartedのハンドラーを実装したWPFUserControlがたくさんありますが、呼び出されることはありません。Windowsでのみ機能するのか、それともWPFAppクラスでのみ機能するのかわかりません。ただし、正しく起動されておらず、アプリを閉じるたびに開いているPerformanceCounterオブジェクトがリークしています。
Dispatcher.ShutdownStartedイベントよりも、管理されていないリソースをクリーンアップするためのより良い代替手段はありますか?Disposeが呼び出されるようにIDisposableを実装するためのトリックはありますか?可能な限り、ファイナライザーの使用は避けたいと思います。