FrameworkElement から派生し、制御下にないクラスがあります。このクラスは、イベント ハンドラをOnInitializeメソッドに登録します。
FrameworkElement は OnInitialize に対応するものを提供しないため、このクラスを適切にクリーンアップするパターンは何ですか?
リークの原因となる EventHandler を削除する部分がないため、ルート化されたままになります。
FrameworkElement から派生し、制御下にないクラスがあります。このクラスは、イベント ハンドラをOnInitializeメソッドに登録します。
FrameworkElement は OnInitialize に対応するものを提供しないため、このクラスを適切にクリーンアップするパターンは何ですか?
リークの原因となる EventHandler を削除する部分がないため、ルート化されたままになります。
「初期化解除」などはありません。初期化メソッドは、構築中に利用できないデータに依存するため、コンストラクターでオブジェクトを完全に初期化できない場合に使用されます。これらの場合、構築は 2 つのフェーズで中断されます。最初のステップはパラメーターなしのコンストラクターで実行され、2 番目のステップはOnInitialize
外部データが使用可能になった後に のような初期化メソッドで実行されます。
あなたが説明するのは、オブジェクトのDispose
メソッドを呼び出すことによって実行されるオブジェクトの破棄です。適切に作成されたクラスは、データをクリーンアップし、外部リソースを解放し、イベント ハンドラーを解放する必要があります。
通常、ビジュアル要素のライフサイクルには、OnLoad/OnUnload メソッドによって処理される別のステップがあります。Load ステップは、要素が実際に XAML ビューに配置され、他の UI 要素に接続されたときに発生します。イベント ハンドラーは、OnLoad メソッドで登録し、OnUnload メソッドで削除する必要があります。
要素にDispose
method がない場合、Unload イベントを発生させてクリーンアップを強制できる場合がありますが、これはちょっとしたハックです。
control.RaiseEvent(new RoutedEventArgs(FrameworkElement.UloadedEvent))
弱いイベント パターンを使用します。特に、実装を使用してイベントをサブスクライブします(または、 .NET 4.5 がオプションである場合はWeakEventManager
、その汎用バージョンを使用することをお勧めします)。WeakEventManager<TEventSource, TEventArgs>
Dispatcher.ShutdownStarted
イベントを使用します。
これをコンストラクターに追加します。
Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
そして、このメソッドにクリーンアップ コードを追加します。
private void Dispatcher_ShutdownStarted(object sender, EventArgs e)
{
Stop();
}