asp.net清理非托管资源的最佳方法

时间:2012-02-14 21:17:11

标签: c# asp.net .net memory-management idisposable

我对ASP.NET应用程序中的内存清理有点困惑。我已经定义了几个析构函数 - 我知道这不是新的.NET处理方式,但我是一个习惯的生物,而且我总是用c ++这样做 - 这在几乎每个场景中都非常有效。但是,我注意到它们有时在我的ASP.NET应用程序中没有被调用。

我正在考虑实现IDisposable,但我认为IDisposable适用于您的代码的其他用户,并且我不确定ASP.NET在完成对象时会调用Dispose。有人可以澄清这个吗?

什么是最好的,最好的我的意思是它总会有效 - 清理我的非托管内存的方法?

修改

This似乎表明如果包含潜在非托管内存的类是封装类的成员,那么析构函数是最好的策略。这对我来说当然有意义,因为我几乎无法尝试或使用类成员。然而,即便如此,这让我回到了我的问题,它有时永远不会在我的ASP.NET应用程序中被调用。

2 个答案:

答案 0 :(得分:3)

处理非托管资源的所有类都应实现IDisposable interface

有关更多信息,垃圾收集器有两个问题。首先,你不知道什么时候会运行。其次,它对非托管资源没有任何了解。这就是为什么它们被称为非托管的原因。

因此,调用代码可以正确dispose使用非托管资源的对象。执行此操作的最佳方法是实现上述接口,并将对象包装在using ( ) { }语句中,或者至少尝试一次。最后。我通常更喜欢使用声明。

此外,通过实现IDisposable,您向其他开发人员发信号通知此类处理非托管资源,以便他们可以采取适当的步骤来确保正确调用。

答案 1 :(得分:1)

使用托管资源时,您不需要实现IDisposable或析构函数。所有你需要做的“清理”是将所有顶级(“rooted”)引用设置为null(静态通常被认为是顶级),垃圾收集器将负责其余的。

在调用者忘记调用Dispose或无法调用此类调用的情况下,这样的析构函数主要用于非托管资源。但是,运行时不保证将调用析构函数;只有在最终释放与对象关联的内存之前才会调用它们。您不必实施IDisposable;这只是一个惯例。使用Close()或Cleanup()方法释放非托管资源是完全合理的。