如何最好地清理.NET应用程序的资源?

时间:2009-01-31 03:57:07

标签: .net memory-leaks

确保Winforms .NET应用程序在其执行生命周期中释放所消耗的所有资源的最佳实践或方法是什么?

特别是文件句柄和图像的发布。

感谢。

5 个答案:

答案 0 :(得分:2)

如果你的实现是白盒子,那么在文件流上调用Close应该关闭它的内存流。

如果类实现了IDisposable,只需在C#中使用using块,这样就可以处理资源:

using (var foo = new Foo())
{
    // Do some stuff to foo
}

如果你正在编写一个会消耗大量内存的包装器,那么我建议实现IDisposable

答案 1 :(得分:1)

遵循这些拇指规则

1 - 尽可能使用use来确保正确处理对象(特别是在处理流和所有对象时)。您可以申请“使用”处理任何IDisposable

using (SteramReader reader=new StreamReader(filePath)) 
{
     //Do your stuff here
}

当您处理流时,将自动调用Close。


2 - 如果您没有使用托管组件,请确保在对象被丢弃或表单关闭时清理它们


3 - 如果您使用过多的XML序列化,请确保使用正确的构造函数,否则会导致内存泄漏 - http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx


4 - 将其他所有内容留给垃圾收集器

答案 2 :(得分:1)

如果你正在编写引用文件/图像的类,那么你有责任提供一种机制来发布它们。

对于所有.NET应用程序(不仅仅是WinForms),在任何支持大文件/内存资源的类型上实现IDisposable总是一个好的开始。

如果您正在使用访问资源的框架类型,那么正如其他人所说的那样,使用块是一种优雅的解决方案。

也可以在请求时强制垃圾收集器处理类型(确定性),但强烈建议您不要这样做,而是让垃圾收集器自行决定提高性能和记忆管理。

最后,因为实际调用Dispose(直接或通过使用)是由您的类型的用户完成的,所以清楚地记录这些(XML注释等)是必不可少的。

有关详细信息,请参阅此earlier SO question

答案 3 :(得分:0)

如果可以,请将它们放入使用块中:

using(Bitmap bitmap = new Bitmap(path)) {
    ...
}

然后将保证在使用块结束时释放位图的资源。否则,请使用Dispose模式:http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

答案 4 :(得分:0)

1.-实现IDisposable接口将帮助您处理非托管资源。 2.-如果您在编程方面访问文件时出现错误,请尝试在try {} catch {} finally语句中关闭()文件或流,以避免锁定该资源 3.垃圾收集器大多数时候都会占用资源