正确处理Singleton IDisposable对象

时间:2012-09-26 03:38:06

标签: c# .net

情境:

应用程序实例化实现IDisposable的类的单个实例。该实例通过静态成员公开,使其可供应用程序的所有部分访问。单个实例需要在应用程序的生命周期内保持活动状态。

问题

在应用程序关闭并且进程终止之前调用Dispose方法有多重要?

我一直认为,在大多数情况下,没有必要调用Dispose,因为流程的终止自然会清理资源。我错了吗?

3 个答案:

答案 0 :(得分:7)

如果“您的应用程序关闭”意味着该过程正在终止,那么您技术上不需要做任何事情。您的流程正在终止,操作系统将释放这些资源。

我认为它们可能是一些模糊的角落案例,其中某些组件可能会创建某种类型的文件或其他资源,如果未调用Dispose,即使您的进程终止,也不一定要清除它。

我想举一个例子,虽然这是一个奇怪的角落案例。假设您在代码中引用并使用组件。创建和使用它时,它会在您的计算机上创建一个2GB的文件。现在让我们更进一步,并说这个组件,实际上关闭文件句柄本身在它使用期间访问这个2GB文件,由于一个错误或只是糟糕的设计。现在,此对象上的Dispose方法清除了此文件,但没有详细记录。基本上,错过Dispose调用会在机器上留下一个文件。这绝对是一个极端情况,并不会导致你的机器“泄漏”任何东西,但你确实有一个2GB的文件就坐在那里。

话虽如此 - 最佳做法是在确定性地完成资源时调用Dispose。您可以在Singleton上调用一个方法 - 比方说Cleanup() - 可以在关闭时运行。

答案 1 :(得分:1)

这篇文章详细解释了为什么要处理事件发布 其他人是一种很好的做法

.NET object events and dispose / GC

由于存在gc不会收集Publisher的极端情况,即使在设置为null之后它仍将继续触发事件。

答案 2 :(得分:0)

如果您想确保调用Dispose方法,如果它不是死亡或活着的情况,您可以附加到AppDomain.CurrentDomain.ProcessExit

如果您必须确保清除资源,请使用监视主可执行文件的shell可执行文件,然后在此之后进行清理。