我正在尝试通过保持对对象的额外弱引用来主动确保我不会导致代码中的内存泄漏,并在应该释放它时检查它是否不再活动(这是条件代码,因此它仅在我运行时运行正在测试)。
为了简单地重现我看到的效果,创建一个新的 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”将其关闭,什么都没有发生——一切都很好。现在做同样的事情,但是当窗口显示时,单击文本框,然后单击“x”。我每次都会收到“内存泄漏”消息。
Ants Profiler 显示 System.Windows.Documents.TextEditor 具有对 TextBox 的引用(可能仅在您聚焦 TextBox 时才设置),并且 TextBox 具有对窗口的引用。它不是真正的内存泄漏,因为如果您多次执行该过程,则会收集以前的窗口,而不是最新的。但是,这意味着我无法编写确认内存没有泄漏的测试。
我是唯一需要这种程度的保证的人,还是有其他方法?