我有一个很大的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)和这个表单的所有资源,就像我关闭程序一样。
答案 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)
几点想法:
using
声明中答案 2 :(得分:1)
也许mainform在显示时创建对自身的引用,检查它分配的任何引用/委托/事件,并确保它们在完成mainform时未注册,或者将事件处理程序(即应用程序事件)移动到单独的类。
到目前为止,我100%“发现了.NET内存泄漏”,它不是!处理所有一次性用品,观看您使用静态参考物做的事情,不要制作重复的活动订阅并尽可能整理它们。
使用SOS作为mouters在运行处理它之后检查mainform类上的gcroots并调用GC.Collect(3)几次,一旦你跟踪引用的位置,你应该找到bug。