オブジェクトへの余分な弱参照を保持し、解放する必要があるときにオブジェクトがアクティブでなくなったことを確認することで、コードでメモリリークが発生しないようにプロアクティブに確認しようとしています(これは条件付きコードであるため、テスト中です)。
私が見ている効果を簡単に再現するには、新しいWPFアプリケーションを作成し、メインウィンドウにボタンを配置します。別のウィンドウを作成し、その上にTextBoxを配置します。ボタンのクリックハンドラーに、次のコードを入力します。
Window1 w = new Window1();
WeakReference weak = new WeakReference(w);
w.ShowDialog();
w = null;
// Equivalent to Application.DoEvents() just in case...
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));
GC.Collect();
GC.WaitForPendingFinalizers();
if (weak.Target != null)
MessageBox.Show("Memory Leak");
これを実行するときは、ボタンをクリックし、ウィンドウが表示されたら、「x」をクリックして閉じます。何も起こりません。すべて問題ありません。同じことを行いますが、ウィンドウが表示されたら、TextBoxをクリックしてから、「x」をクリックします。毎回「メモリリーク」メッセージが表示されます。
Ants Profilerは、System.Windows.Documents.TextEditorにTextBoxへの参照があり(おそらく、TextBoxにフォーカスした場合にのみ設定されます)、TextBoxにウィンドウへの参照があることを示しています。プロセスを複数回実行すると、最新ではなく以前のウィンドウが収集されるため、実際のメモリリークではありません。ただし、メモリがリークしていないことを確認するテストを作成できないことを意味します。
このレベルの保証を望んでいるのは私だけですか、それとも別の方法がありますか?