【发布时间】:2011-07-08 01:06:37
【问题描述】:
在我之前的帖子中,当我生成批量 pdf(超过 1000 页)时,我发布了一个错误“加载报告失败”。然后我给了 obj.Dispose() 它解决了我的问题。那么,谁能告诉我点网中 Dispose() 和垃圾收集器的实际功能是什么。
谢谢, saj
【问题讨论】:
-
你不能在一切上依赖GC,就像你不能在一切上依赖你的父母、你的女仆或你的管家>.
标签: asp.net
在我之前的帖子中,当我生成批量 pdf(超过 1000 页)时,我发布了一个错误“加载报告失败”。然后我给了 obj.Dispose() 它解决了我的问题。那么,谁能告诉我点网中 Dispose() 和垃圾收集器的实际功能是什么。
谢谢, saj
【问题讨论】:
标签: asp.net
.NET 垃圾收集器管理托管对象(本机 .NET 对象)的内存,但它不管理,也不能直接清理非托管资源。托管资源是由垃圾收集器隐式清理的资源。您不必编写代码来显式释放此类资源。相反,您必须在代码中显式清理非托管资源(文件句柄、数据库集合等)。
【讨论】:
垃圾收集器仅适用于托管对象。当您有一个由类分配的 unmanaged 内存时使用 Dispose,因为当类不使用时需要手动释放它。如果您没有实现 dispose 模式(您似乎这样做了),那么内存永远不会被释放,并且您有非托管内存的内存泄漏。如果您这样做但不调用它,则您依赖于运行(并调用 Dispose)的垃圾收集器来释放非托管内存,这可能会或可能不会在您需要的时间范围内发生。 (几乎)总是最好将实现 IDisposable 的类的对象包装在 using 语句中,以保证在对象超出范围时调用 Dispose 方法。
using (var obj = new DisposableObject())
{
...
}
【讨论】:
看到这个问题:How to dispose a class in .net?
IDisposable 与 释放内存。 IDisposable 是一个 释放非托管资源的模式...
【讨论】:
当不再需要该对象时,任何实现 IDisposable 的对象都会调用 Dispose()。此方法负责释放已分配的系统资源。此模式提供对象的急切集合。
使用 sn-p 包含实例化和使用一次性资源的代码块是一个好习惯:
using (var disposable = new Disposable())
{
// your code goes here
}
不知道 GC 何时运行,它可能会保留资源超过必要的时间。
【讨论】: