C#表单应用程序

时间:2017-02-01 16:30:44

标签: c# .net forms memory-leaks

我有一个课程,根据某个事件,我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
     }
}

我初始化表单对象的方式是否存在问题?那些没有被处置?

2 个答案:

答案 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分析器对泄漏进行故障排除。

请参阅此帖子了解替代方案:

What Are Some Good .NET Profilers?