我是否应该打扰处理共享进程生命周期的对象?

时间:2012-03-12 22:47:08

标签: c# dispose idisposable

我知道实现IDisposable的所有对象应该在不再需要时立即处理掉,以释放其非托管资源使用的内存。

我的问题与我知道的事实的对象有关,直到主机进程本身终止为止。如果我处理它们会不会有任何区别?当进程死亡时,是否存在未释放内存的可能性? GDI对象怎么样?即使没有处理过程,GDI句柄是否会在进程死亡时被释放?

我完全明白,无论如何都要妥善处理所有物品。我纯粹是出于好奇而问。

2 个答案:

答案 0 :(得分:7)

这取决于有问题的对象(资源)。

当进程终止所有非托管内存时,即使关联的终结器无法运行,也会释放文件句柄和其他OS资源。

但我对数据库句柄,命名互斥体等不太确定。

因此,在您认为调用Dispose之前,您必须知道资源类型及其与流程的关系。更容易从一般原则中调用Dispose()。

但这是理论上的争论,大多数课程都会使用SafeHandle : CriticalFinalizerObject。所以我认为这不是一个真正的实际问题。

答案 1 :(得分:2)

没有。通过 design ,IDisposable可用于允许程序尽早释放非托管资源,而不是终结器可以完成。无论何时执行垃圾收集,它都会在相当不可预测的时间运行,通常以后。你无法预测何时会发生这种情况。

在程序退出时处置没有意义,终结器可以保证在卸载AppDomain之前运行并且进程关闭。

据说,有一些IDisposable滥用,实际期望你调用它的代码。但这通常基于使用语句,所以不太可能会遇到这种情况。