Windows窗体应用程序中的内存管理:加载和关闭窗体

问题描述

|| 这是我第一次在论坛上提问...如果我太详细了,请向我道歉... 我创建了一个程序,该程序加载了某些表单(例如系统菜单),并且该程序的一部分(表单)在列表视图中显示数据库中表的内容(这部分工作正常)。当我在程序开始时访问该表单时,它完成了大约4-5秒的加载。 这就是问题所在...当我多次访问程序的某些部分时(例如,在两个表单之间来回移动),然后访问显示表格的表单,加载速度就会变慢...
        InitializeComponent();
        //I just did this to travel back and forth to two forms easier...
        if (MessageBox.Show(\"\",\"\",MessageBoxButtons.OKCancel,MessageBoxIcon.@R_260_4045@ion,MessageBoxDefaultButton.Button1) == DialogResult.OK)
        {
            Form2 f = new Form2();
            this.Hide();
            f.ShowDialog();
            this.dispose();
            //this.Close();   //I\'m not exactly sure which one to use here... but whichever I use,I get same results.
        }
        //there\'s another one of this in the first form... 
        //so they loop to each other until i press cancel...
当我专注于消息框并按\'enter \'一段时间(不知道...大约30秒到1分钟)并访问显示表格的表单时。它加载非常缓慢。 (有一个进度条,可以查看我需要等待多长时间。当我按下“ enter”(输入)大约2分钟时,我等待了大约1分钟才能加载它) 另外,就像在代码上看到的一样,我不确定表单上的dispose()和Close()之间的区别(如果有的话)。从我读过的内容中,dispose()...好吧...处置它所使用的对象的内存分配。我不确定,但我认为Close()也能做到这一点... 我应该怎么做才能提高性能?     

解决方法

        您可以使用using语句创建表单,使用Statement(C#参考) 还有这个
   using(Form2 f = new Form2())
{
            this.Hide();
            f.ShowDialog();
            }
但是,为了提高与UI分离的代码的性能,我的意思是代码中加载数据的部分并将其保存在单独的类中     ,        杰拉尔德, Close()将关闭表单(即从视图中将其删除)。 Dispose()将(如您建议的那样)重新分配其资源,以便可以对窗口进行垃圾回收。因此,如果您不再需要它,请调用Dispose(),如果您以后想要再次显示它,则请调用Close()。 值得注意的一件事:ShowDialog()是一个阻止调用。换句话说,将显示对话框窗口,但是在关闭对话框窗口之前,代码不会打到下一行。 因此,每次打开新窗口时,前一个窗口都会保存在内存中,因此,该窗口中显示的数据库中的所有数据也可能会保存在内存中。我认为这可能是造成您的性能问题的原因。 如果您想在每次打开新窗口时清理当前窗口,请尝试用Show()替换ShowDialog(),因为这将打开新窗口并立即返回。     ,        首先,检查内存使用情况。最简单的方法是在“进程”选项卡下的“任务管理器”中查看,并查看应用程序的内存使用量如何增加。这样,您可以检测是否存在内存泄漏。 如果是内存泄漏(分配内存在不断增加而没有释放),则应检查表单是否存在内存泄漏。一个常见的错误是使表单被表单之外的某些静态变量或事件引用等引用。     ,         如果您以
form.Show()
或ѭ3show显示表格以将其关闭,则足以调用
form.Close()
,ѭ5会被自动调用。 当您使用
form.ShowDialog()
时,
Close()
上没有放置表格,您需要调用ѭ8let让Garbage Collector清除内存。 如果形式彼此独立,则以“ 9”代替“ 6”。
ShowDialog()
被阻止,您的代码将停止运行,直到您关闭第二个表单(未处置第一个表单)。 如果您多次使用表格,可以按
form.Hide()
隐藏它。组件保持初始化,然后在ѭ13上,您仅更新数据或可以绑定到组件。