gpt4 book ai didi

wpf - 如何强制窗口进行垃圾回收?

转载 作者:行者123 更新时间:2023-12-02 17:38:00 26 4
gpt4 key购买 nike

我正在尝试通过保留对对象的额外弱引用来主动确保我不会在代码中导致内存泄漏,并检查它在应该释放时不再处于事件状态(这是条件代码,因此它只当我测试时运行)。

为了简单地重现我所看到的效果,创建一个新的 WPF 应用程序并在主窗口上放置一个按钮。创建另一个窗口,并在其上放置一个文本框。在按钮的点击处理程序中,输入以下代码:

  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 具有对窗口的引用。这不是真正的内存泄漏,因为如果您多次执行该过程,则会收集以前的窗口,而不是最新的窗口。但是,这意味着我无法编写确认内存没有泄漏的测试。

我是唯一想要这种级别保证的人,还是有其他方法?

最佳答案

我认为有些人没有捕获你问题的重点。您并不是试图强制 GC 采取行动,而是先发制人地发现任何内存泄漏,为此我为您鼓掌。

在这种特殊情况下,看起来好像TextEditor(这是内部)正在添加事件处理程序,并且在检查运行时尚未有机会分离。在启动调度程序之前,您是否尝试过将焦点明确地从关闭的窗口移出?

我认为,如果您尝试在应用程序中正确执行这些测试,而不是在更受控制的集成测试环境中进行这些测试,您将继续遇到此类问题,因此也许您需要重新考虑您的方法。

关于wpf - 如何强制窗口进行垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11182651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com