Windows窗体应用程序中的内存管理:加载和关闭窗体
本文关键字:窗体 加载 内存 应用程序 Windows 管理 | 更新日期: 2023-09-27 17:59:02
这是我第一次在论坛上提问。。。如果我说得太详细,我会提前道歉。。。
我创建了一个程序,它加载一些表单(比如系统的菜单),程序的一部分(表单)在列表视图中显示数据库中表的内容(这部分工作正常)。当我在程序开始时访问该表单时,它会在大约4-5秒内完成加载。
问题是。。。当我多次访问程序的某些部分时(例如,在两个表单之间来回切换),然后访问显示表格的表单,加载速度会变慢。。。
InitializeComponent();
//I just did this to travel back and forth to two forms easier...
if (MessageBox.Show("", "", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, 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...
当我把注意力集中在消息框上,按下"输入"一段时间(不知道…大约30秒到1分钟),然后访问显示表格的表格。它加载非常慢。(有一个进度条可以查看我需要等待多长时间。当我按下"回车"键大约2分钟时,我等待了大约1分钟才加载)
此外,就像在代码中看到的一样,我不确定表单上Dispose()和Close()之间的区别(如果有的话)。根据我所读到的,Dispose()。。。好处理它所用对象的内存分配。我不确定,但我认为Close()也能做到这一点。。。
我应该做些什么来提高绩效?
您可以使用using语句创建表单,使用statement(C#引用)和这个
using(Form2 f = new Form2())
{
this.Hide();
f.ShowDialog();
}
但为了提高性能,将代码与UI分离,我指的是加载数据并将其保存在单独类中的代码部分
Gerald,
Close()将关闭窗体(即将其从视图中删除)。Dispose()将(按照您的建议)释放其资源,以便可以对窗口进行垃圾收集。因此,如果您不再需要,请调用Dispose(),如果您稍后可能想再次显示,请调用Close()。
有一点值得注意:ShowDialog()是一个阻塞调用。换句话说,对话框窗口将显示,但在对话框窗口关闭之前,代码不会到达下一行。
因此,每次打开一个新窗口时,前一个窗口都会保存在内存中——因此,窗口上显示的数据库中的所有数据也可能会保存在存储器中。我认为这可能是你表现出问题的原因。
如果您想在每次打开新窗口时清理当前窗口,请尝试将ShowDialog()替换为Show(),因为这会打开新窗口并立即返回。
首先,检查内存使用情况。最简单的方法是在"进程"选项卡下的"任务管理器"中查看应用程序的内存使用率是如何增加的。通过这种方式,您可以检测是否存在内存泄漏。
如果是内存泄漏(分配的内存不断增加而没有被释放),那么您应该检查您的表单是否存在内存泄漏。一个常见的错误是让表单被表单外部的一些静态变量或一些事件引用等引用。
- 如果您通过
form.Show()
或Application.Run(new Form())
显示表单以关闭它,则可以调用form.Close()
,并且会自动调用Dispose()
。当您使用form.ShowDialog()
时,表单未在Close()
上处理,您需要调用form.Dispose()
来让垃圾回收器清除内存 - 如果形式彼此独立,则用
Use form.Show()
代替form.ShowDialog()
。ShowDialog()
正在阻塞,您的代码将停止运行,直到您关闭第二个表单(第一个表单未被处理) - 如果您多次使用表单,您可以通过
form.Hide()
将其隐藏。组件保持初始化状态,然后在Show()
上只更新数据,或者可以绑定到组件