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