为什么这个Dispose()方法需要,因为.net有自动垃圾收集器

时间:2011-03-03 12:52:57

标签: asp.net

在我之前的帖子中,当我执行批量pdf(超过1000页)生成时,我发布了错误“加载报告失败”。然后我给了obj.Dispose()它解决了我的问题。那么,任何人都能告诉我在dot net中Dispose()和垃圾收集器的实际功能是什么。

谢谢, saj

4 个答案:

答案 0 :(得分:1)

.NET垃圾收集器管理托管对象(本机.NET对象)的内存,但它不管理,也不能直接清理非托管资源。托管资源是垃圾收集器隐式清理的资源。您不必编写代码来显式释放此类资源。相反,您必须在代码中明确清理非托管资源(文件句柄,数据库集合等)。

答案 1 :(得分:1)

垃圾收集器仅适用于托管对象。当您具有由类分配的非托管内存时,将使用Dispose,因为在不使用该类时需要手动释放它。如果你没有实现dispose模式(你似乎这样做),那么内存永远不会被释放,并且你有一个非托管内存的内存泄漏。如果你这样做但没有调用它,你依赖于垃圾收集器运行(并调用Dispose)来释放非托管内存,这可能会或可能不会在你需要的时间范围内发生。 (几乎)总是最好在using语句中包装实现IDisposable的类的对象,以保证在对象超出范围时调用Dispose方法。

using (var obj = new DisposableObject())
{
    ...
}

答案 2 :(得分:0)

请参阅此问题:How to dispose a class in .net?

  

IDisposable与此无关   释放记忆。 IDisposable是一个   释放非托管资源的模式......

答案 3 :(得分:0)

任何实现IDisposable shold的对象都会在不再需要该对象时调用Dispose()。此方法负责释放已分配的系统资源。此模式提供了对象的热切集合。

将代码块实例化并使用带有代码段的可处理资源是一个很好的做法:

using (var disposable = new Disposable())
{
    // your code goes here
}

不知道什么时候GC会运行,它可能会使资源保持超过必要的时间。