我有一个子窗体,其中包含一个加载了RichText资源文件的RichTextBox。
单击关闭子窗体的按钮(使用Close())时,窗体将关闭并返回父窗体。然而,资源并没有被处理掉。事实上,在我的鼠标按钮几乎耗尽之后,记忆真的升级了。
为了测试资源是否最终会被释放,我在父窗体上设置了一个窗体计时器来加载子窗体,并在子窗体中设置了另一个窗体计时器来调用Close()。这一次,资源在大约5到6个打开/关闭周期后释放。
嗯..。我想。所以我改变了设置来模拟现实。这一次,我将子窗体计时器触发事件更改为包含button1.PerformClick(),该事件触发button1按下事件,该事件包含Close()语句。这一次,资源没有被释放,在我中止测试之前,内存使用量上升到了1 up!
为什么包含Close()的按钮事件与包含Close()的定时器事件不同
好的..。下面是用于打开子窗体的父窗体代码:-
private void showSplashScreen()
{
// Instantiating SplashScreen
SplashScreen splash = new SplashScreen();
// Displaying SplashScreen
splash.ShowDialog();
}下面是关闭窗体的子窗体上的代码:
private void button1_Click( object sender, EventArgs e )
{
Close();
}
private void timer1_Tick( object sender, EventArgs e )
{
button1.PerformClick();
// Close();
}以这种方式运行时,内存使用量会升级..但是,如果button1.PerformClick()被注释掉,而Close()被取消注释,那么资源就会定期发布
发布于 2012-10-04 23:33:17
根据Form.Close MSDN Documentation,如果你使用ShowDialog,你需要手动处理你的资源。我会在FormClosing事件中这样做。至于为什么你使用计时器时它还能工作,我不太确定。但通常情况下,当我使用ShowDialog时,我会检查DialogResult,然后从父级关闭窗体。尽管像你那样使用Using可以更清晰地处理它。
SplashScreen splash = new SplashScreen();
DialogResult dr == splash.ShowDialog();
if (dr == System.Windows.Forms.DialogResult.OK)
{
//Do something
}
else
{
//do something else
}
splash.Close();
splash.Dispose();关闭时不处置表单的两种情况是:(1)该表单是多文档界面应用程序的一部分,并且该表单不可见;(2)您使用ShowDialog显示了该表单。在这些情况下,您将需要手动调用Dispose来将窗体的所有控件标记为垃圾回收。
发布于 2012-10-04 23:10:42
好了,根据Cyborgx37的想法,我更改了父窗体上的调用方法,如下所示:
private void showSplashScreen()
{
// Instantiating SplashScreen. 'using' to allow proper release of resources
using ( SplashScreen splash = new SplashScreen() ) {
// Displaying SplashScreen
splash.ShowDialog();
}
}现在可以正确地释放资源了。但是,我不明白为什么关闭子窗体的计时器允许正确处理资源,而按钮单击关闭却不允许。我甚至看过IL代码,这两个方法使用相同的代码。有什么想法吗?
https://stackoverflow.com/questions/12726390
复制相似问题