C#WinForm内存泄漏

时间:2012-07-08 14:07:12

标签: c# memory memory-leaks

我有一个很大的winform类,可以从这样一个小小的调用:

    void login()
    {           
        mainForm f1 = new mainForm();                
        f1.ShowDialog();
    }

登录后,mainForm会占用大量内存(我在任务管理器中查看)。关闭mainForm后,程序返回登录表单。在这一步,我再次检查任务管理器,看到我的程序没有释放mainForm使用的内存。在一些登录后,我的程序崩溃并显示“Out of Memory”错误。

我不得不说我测试了f1.Dispose(),f1 = null,GC.Collect()以及我找到的所有其他方法。

它只会在我关闭登录表单时释放内存(它是Application.Run中使用的起始类)

我想破坏mainForm实例(f1)和这个表单的所有资源,就像我关闭程序一样。

3 个答案:

答案 0 :(得分:3)

不确定OOM与登录表单有什么关系。并且肯定不是关闭或处理表单会减少Taskmgr.exe报告的内存使用量。

但你肯定做错了。在Winforms中对话框的处理方式不同,它不会像使用Show()那样显示的表单自动处理。必然如此,您希望在关闭后检索用户在对话框中输入的内容,这在处理对话框时会很危险。所以你必须自己做。正确的模式是:

    using (mainForm f1 = new mainForm()) {
        if (f1.ShowDialog() == DialogResult.Ok) {
            // Retrieve data entered by user and do something with it
            //...
        }
    }

使用 using 语句确保对话框实例在之后处理后,检索到对话框结果。

答案 1 :(得分:2)

几点想法:

答案 2 :(得分:1)

也许mainform在显示时创建对自身的引用,检查它分配的任何引用/委托/事件,并确保它们在完成mainform时未注册,或者将事件处理程序(即应用程序事件)移动到单独的类。

到目前为止,我100%“发现了.NET内存泄漏”,它不是!处理所有一次性用品,观看您使用静态参考物做的事情,不要制作重复的活动订阅并尽可能整理它们。

使用SOS作为mouters在运行处理它之后检查mainform类上的gcroots并调用GC.Collect(3)几次,一旦你跟踪引用的位置,你应该找到bug。