【问题标题】:How to best clean up resources for .NET application?如何最好地清理 .NET 应用程序的资源?
【发布时间】:2010-10-04 15:13:48
【问题描述】:

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

特别是文件句柄和图像的释放。

谢谢。

【问题讨论】:

    标签: .net memory-leaks


    【解决方案1】:

    遵循这些拇指规则

    1 - 尽可能使用 using 来确保正确处理对象(尤其是在使用流和所有对象时)。您可以应用“使用”来处理任何 IDisposable

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

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


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


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


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

    【讨论】:

      【解决方案2】:

      如果可以的话,把它们放在使用块中:

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

      那么bitmap的资源会保证在using块结束时释放。否则,使用 Dispose 模式:http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

      【讨论】:

        【解决方案3】:

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

        如果类实现了 IDisposable,只需在 C# 中使用 using 块,这样资源就会被释放:

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

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

        【讨论】:

        • 如果using块内的代码抛出异常怎么办?
        • 使用 using 块可以确保资源将被释放,即使 using 块中发生异常也是如此。
        • 编译器将 using 块转换为 try..finally 块,并在 finally 中调用 foo.Dispose()。这样编译器保证即使你的代码抛出异常也会调用 Dispose。
        • 谢谢大家。这正是我想要的。
        【解决方案4】:

        如果您正在编写引用文件/图像的类,则您有责任为这些文件/图像提供一种释放机制。

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

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

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

        最后,由于实际调用 Dispose(直接或通过使用)是由您的类型的用户完成的,因此必须清楚地记录这一点(XML cmets 等)。

        查看earlier SO question了解更多详情

        【讨论】:

        • 是的,我对清理自己的参考资料特别感兴趣。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2012-01-18
          • 2014-10-17
          • 1970-01-01
          • 2010-10-21
          • 2016-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多