清除FlowLayoutPanel中没有调用析构函数的控件?

时间:2009-09-04 11:24:25

标签: .net winforms garbage-collection destructor flowlayoutpanel

很抱歉,如果我遗漏了一些明显的东西,但我正在尝试从FlowLayoutPanel清除控件(一系列用户控件) - (panelName).Controls.Clear();.不幸的是,这似乎并没有调用面板上对象的析构函数 - 任务管理器中的User Objects列只是不断上升,直到它达到10,000并抛出异常。

有谁知道我在这里缺少什么?

4 个答案:

答案 0 :(得分:2)

不是解决方案,而是一种解决方法 - 这些(粗略的,内存中)代码似乎破坏了对象:

while(FlowLayoutPanel.Controls.Count > 0)
     FlowLayoutPanel.Controls.Remove(0);

答案 1 :(得分:2)

上面的eftpotrm的解决方法仍然保持用户处理数量增长对我来说,但是,如果你只是在删除控件后手动处理,那就为我修复了100%。

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工具很容易使用,所以倾向于首先尝试它们。