我有一个课程,根据某个事件,我initialize
一个新的基于表单的对话框和initialize
它。这个基于表单的对话框里面有其他控件。
当dialog
关闭时,我清除并处理在表单中创建的所有控件。不幸的是,似乎某些东西没有被处理掉,或者即使在删除后仍留在记忆中。
表格泵
class someClass
{
System.Timers.Timer someTimer;
public void CallToChildThread(Object stateInfo)
{
// check some event
// if true, fire event
}
someClass()
{
someTimer= new System.Threading.Timer(CallToChildThread,
autoEvent, 1000, 250);
_show += new EventHandler(eventCheck);
}
void eventCheck()
{
formClass formClassObject = new formClass(); //create form
formClassObject.someFunction(); // has some other function and does a showDialog on self
formClassObject.Dispose();
formClassObject = null;
}
}
在formClass对象中,在获取FormClosed事件后,我会释放对象内控件内的所有控件和控件,但仍然存在明显的内存泄漏。
表单类
public partial class formClass
{
//Initialize a bunch of managed resources to null
someOtherForm form2;
someOtherForm form3;
//connect some events on child forms to buttons on this form object
this.form2.cancelButtonClicked += someFunction;
this.form3.cancelButtonClicked += someFunction;
// Form closed Event
private void formClass_FormClosed(object sender, FormClosedEventArgs e)
{
//set form2 and form3 visibility to false
// clear AND dispose all controls of form2
// clear AND dispose all controls of form3
//set form2 and form3 to null
// clear AND dispose off all controls of formClass
// Dispose this (formClass) object
}
}
我初始化表单对象的方式是否存在问题?那些没有被处置?
答案 0 :(得分:1)
请参见此处:Memory Leaks in Winforms application
尝试在处理之前删除事件处理程序(_show)以真正处理子表单内存。
答案 1 :(得分:0)
您没有删除事件处理程序,这可能是泄漏源。 可能你应该使 someClass 一次性并删除Dispose方法中的处理程序。
如何验证是否存在泄漏?垃圾收集器可能会延迟运行,给人一种不收集内存的感觉。您可以在每个表单处理后显式调用gb,看看会发生什么:
formClassObject.Dispose();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
其他一些提示:
您创建的表单可能会抛出异常但未正确处理。 由于您创建模态对话框(调用ShowDialog),您应该使用使用模式:
using (formClass formClassObject = new formClass())
{
formClassObject.someFunction();
}
您可以使用.NET分析器对泄漏进行故障排除。
请参阅此帖子了解替代方案: