在我之前的帖子中,当我执行批量pdf(超过1000页)生成时,我发布了错误“加载报告失败”。然后我给了obj.Dispose()它解决了我的问题。那么,任何人都能告诉我在dot net中Dispose()和垃圾收集器的实际功能是什么。
谢谢, saj
答案 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会运行,它可能会使资源保持超过必要的时间。