2012-10-04 36 views
2

我有一个子窗体,其中包含一个加载了RichText资源文件的RichTextBox按钮点击导致子窗体无法处理C#

当点击关闭子窗体的按钮(使用Close())时,窗体关闭并返回到父窗体。但是,资源没有被处置。事实上,在几乎将我的鼠标按下后,内存确实升级了。

作为一项测试,看看资源是否最终会被释放,我在父级上设置了一个窗体计时器,以便在子窗体中加载子窗体并调用Close()。这次资源在大约5或6次打开/关闭循环后被释放。

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

为什么包含Close()的按钮事件与包含Close()的计时器事件有所不同?

OK ..这里的父窗体上的代码,打开子窗体: -

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()被取消注释资源定期发布

+1

理想情况下,您需要显示在您正在测试的Close方法中启动子窗体和代码的代码。虽然有表单的引用,它不会被垃圾收集器处理。 –

+0

不清楚..邮政编码也 –

+0

欢呼的编辑! – Zantuna

回答

0

OK Guys ,用Cyborgx37的想法,我已经改变了父窗体上的调用方法,如下所示: -

private void showSplashScreen() 
{ 
    // Instantiating SplashScreen. 'using' to allow proper release of resources 
    using (SplashScreen splash = new SplashScreen()) { 
     // Displaying SplashScreen 
     splash.ShowDialog(); 
    } 
} 

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

1

根据Form.Close MSDN Documentation如果您使用ShowDialog,则需要手动处理您的资源。我会在FormClosing活动中做哪些事情。至于为什么它在你使用Timer的时候工作,我不确定。但通常当我使用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)它是一个多文档界面的一部分(MDI)应用,并且所述形式是不可见的;和(2)你使用ShowDialog显示了表单。在这些情况下,您需要手动调用Dispose来标记垃圾收集的所有表单控件。

+0

+1链接至相关文档。我不知道这是一个明确的要求......只是我一直遵循的最佳做法。 – JDB

+0

@ Mark Hall虽然我现在已经解决了这个问题,但我想我会尝试一下你的解决方案。现在,在某些情况下,收集GC _is_时会发现,每隔一段时间就会减少一次。但是,它仍然越来越高,好像GC不能跟上。 'using()'在100%的时间内工作。真奇怪! – Zantuna