抱歉,如果我遗漏了一些明显的东西,但我正在尝试从 FlowLayoutPanel - (panelName).Controls.Clear(); 中清除控件(一系列用户控件)。不幸的是,这似乎并没有调用面板上对象的析构函数——任务管理器中的用户对象列一直在上升,直到达到 10,000 并引发异常。
有谁知道我在这里想念什么?
抱歉,如果我遗漏了一些明显的东西,但我正在尝试从 FlowLayoutPanel - (panelName).Controls.Clear(); 中清除控件(一系列用户控件)。不幸的是,这似乎并没有调用面板上对象的析构函数——任务管理器中的用户对象列一直在上升,直到达到 10,000 并引发异常。
有谁知道我在这里想念什么?
不是一个解决方案,而是一种解决方法 - 对象似乎确实被这个(粗略的,从内存中)代码破坏了:
while(FlowLayoutPanel.Controls.Count > 0)
FlowLayoutPanel.Controls.Remove(0);
上面 eftpotrm 的解决方法仍然让我的用户句柄数不断增长,但是,如果您只是在删除控件后手动处理,那对我来说 100% 修复了它。
while (myFlowLayoutPanel.Controls.Count > 0)
{
var controltoremove = myFlowLayoutPanel.Controls[0];
myFlowLayoutPanel.Controls.Remove(controltoremove);
controltoremove.Dispose();
}
.NET 没有析构函数的概念。.NET 有一个叫做“终结器”的东西,它在语法上看起来像 C# 中的析构函数。有关更多信息,请查看 Jeff Richter 关于 CLR 工作原理的精彩书籍 - CLR via C#。
您可能希望对象实现 IDisposable 模式,然后在完成它们后调用它们的 Dispose() 方法。
尝试使用内存分析器(例如ants)它会告诉您是什么使控件保持活动状态。尝试第二次猜测这类问题非常困难。
Red-gate 给出了 14 天的尾巴,这应该足够多的时间来解决这个问题并确定内存分析器是否为您提供长期价值。
市场上有很多其他内存分析器(例如.NET Memory Profiler),其中大多数都有免费试用版,但是我发现Red-Gate工具很容易使用,所以倾向于先尝试一下。