首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按钮单击导致子窗体无法释放C#

按钮单击导致子窗体无法释放C#
EN

Stack Overflow用户
提问于 2012-10-04 19:35:20
回答 2查看 620关注 0票数 2

我有一个子窗体,其中包含一个加载了RichText资源文件的RichTextBox

单击关闭子窗体的按钮(使用Close())时,窗体将关闭并返回父窗体。然而,资源并没有被处理掉。事实上,在我的鼠标按钮几乎耗尽之后,记忆真的升级了。

为了测试资源是否最终会被释放,我在父窗体上设置了一个窗体计时器来加载子窗体,并在子窗体中设置了另一个窗体计时器来调用Close()。这一次,资源在大约5到6个打开/关闭周期后释放。

嗯..。我想。所以我改变了设置来模拟现实。这一次,我将子窗体计时器触发事件更改为包含button1.PerformClick(),该事件触发button1按下事件,该事件包含Close()语句。这一次,资源没有被释放,在我中止测试之前,内存使用量上升到了1 up!

为什么包含Close()的按钮事件与包含Close()的定时器事件不同

好的..。下面是用于打开子窗体的父窗体代码:-

代码语言:javascript
复制
private void showSplashScreen()
{
    // Instantiating SplashScreen
    SplashScreen splash = new SplashScreen();
    // Displaying SplashScreen
    splash.ShowDialog();
}

下面是关闭窗体的子窗体上的代码:

代码语言:javascript
复制
private void button1_Click( object sender, EventArgs e )
{
    Close();
}


private void timer1_Tick( object sender, EventArgs e )
{
    button1.PerformClick();
//    Close();
}

以这种方式运行时,内存使用量会升级..但是,如果button1.PerformClick()被注释掉,而Close()被取消注释,那么资源就会定期发布

EN

回答 2

Stack Overflow用户

发布于 2012-10-04 23:33:17

根据Form.Close MSDN Documentation,如果你使用ShowDialog,你需要手动处理你的资源。我会在FormClosing事件中这样做。至于为什么你使用计时器时它还能工作,我不太确定。但通常情况下,当我使用ShowDialog时,我会检查DialogResult,然后从父级关闭窗体。尽管像你那样使用Using可以更清晰地处理它。

代码语言:javascript
复制
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来将窗体的所有控件标记为垃圾回收。

票数 1
EN

Stack Overflow用户

发布于 2012-10-04 23:10:42

好了,根据Cyborgx37的想法,我更改了父窗体上的调用方法,如下所示:

代码语言:javascript
复制
private void showSplashScreen()
{
    // Instantiating SplashScreen.  'using' to allow proper release of resources
    using ( SplashScreen splash = new SplashScreen() ) {
        // Displaying SplashScreen
        splash.ShowDialog();
    }
}

现在可以正确地释放资源了。但是,我不明白为什么关闭子窗体的计时器允许正确处理资源,而按钮单击关闭却不允许。我甚至看过IL代码,这两个方法使用相同的代码。有什么想法吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12726390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档