Tag: resource leak

使用对话框表单周围的语句来确保垃圾回收

我们有一个包含数千个表单的Windows窗体应用程序。 其中许多通过ShowDialog()方法临时显示为对话框。 这个应用程序已存在多年,我们发现由于表单中的各种资源泄漏或它使用的控件,许多表单没有及时收集垃圾。 具体来说,我们已经找到了未正确处理的GDI +资源的示例,尽管可能存在尚未表征的其他类型的资源泄漏。 虽然解决这个问题的正确方法显然是要经历每一种forms和每一种控制,并消除所有的资源问题。 这需要一些时间来完成。 作为一个短期的替代方案,我们发现在表单上显式调用Dispose()似乎启动了垃圾收集过程,并且表单及其资源立即被释放。 我的问题是,在一个using语句中包装每个表单的ShowDialog()块是否是一个合理的解决方法,以便在显示表单后调用Dispose(),这也是一个很好的做法吗? 例如,从以下位置更改现有代码: public void ShowMyForm() { MyForm myForm = new MyForm(); myForm.ShowDialog(); } 对此: public void ShowMyForm() { using (MyForm myForm = new MyForm()) { myForm.ShowDialog(); } } 在我们的测试中,第一个示例永远不会调用MyForm的Dispose()方法,但第二个示例会立即调用它。 当我们花时间追踪每个特定的资源问题时,这似乎是一种合理的方法作为短期解决方法吗? 我们是否可以考虑采用其他方法来确定和解决这些类型的资源问题的短期解决方法和/或方法?

为什么在main()退出之前调用Dispose()?

我的.net服务通过在Main()循环退出之前调用finally块中的resourceName.Dispose()来清除所有非托管资源。 我真的必须这样做吗? 我是否认为我不能泄漏任何资源,因为这个过程正在结束? Windows将关闭任何不再使用的句柄,对吧?

我需要在ManualResetEvent上调用Close()吗?

我一直在阅读.NET Threading,并正在研究一些使用ManualResetEvent的代码。 我在互联网上找到了很多代码示例。 但是,在阅读WaitHandle的文档时,我看到以下内容: WaitHandle实现了Dispose模式。 请参阅实现Finalize和Dispose以清理非托管资源。 没有任何样本似乎在他们创建的ManualResetEvent对象上调用.Close(), 甚至是来自pfxteam博客的好的Recursion and Concurrency文章 ( 编辑 – 这有一个我错过的使用块)。 这只是示例疏忽,还是不需要? 我很好奇,因为WaitHandle“封装了特定于操作系统的对象”,因此很容易出现资源泄漏。