设想:
应用程序实例化实现IDisposable
. 该实例通过一个静态成员公开,使其可供应用程序的所有部分访问。单个实例需要在应用程序的整个生命周期内保持活动状态。
问题
Dispose
在应用程序关闭和进程终止之前调用该方法有多重要?
我一直认为,在大多数这样的场景下,不需要调用Dispose
,因为进程的终止自然会清理资源。我错了吗?
如果“您的应用程序关闭”是指该过程正在终止,那么您在技术上不需要做任何事情。您的进程正在终止,操作系统将释放这些资源。
我想它们可能是一些晦涩的极端情况,其中某些组件可能会创建某种类型的文件或其他资源,如果Dispose
未调用,即使您的进程终止,也不一定会被清理。
我想举一个例子,尽管这是一个奇怪的极端案例。假设您在代码中引用并使用了一个组件。当你创建和使用它时,它会在你的机器上创建一个 2GB 的文件。现在让我们更进一步,说这个组件实际上关闭了文件句柄,在它使用期间的某个时候访问这个 2GB 文件,由于错误或设计不当。现在Dispose
这个对象上的方法清理了这个文件,但它没有很好的记录。本质上,错过Dispose
对 this 的调用会在机器上留下一个文件。这绝对是一个极端情况,不会导致您的机器“泄漏”任何东西,但您确实有一个 2GB 的文件就坐在那里。
话虽如此 - 最佳做法是Dispose
在您确定性地完成资源时调用。你可以在你的 Singleton 上调用一个方法——比方说Cleanup()
——它可以在你关闭时运行。
这篇文章详细解释了为什么处置 event pub Others 是一个好习惯
由于存在 gc 不会收集 Publisher 的极端情况,即使设置为 null 也会继续触发事件。
如果你想确保你的 Dispose 方法被调用,并且如果它不是死亡或活着的情况,你可以附加到AppDomain.CurrentDomain.ProcessExit
.
如果您绝对必须确保已清理资源,请使用 shell 可执行文件来监视您的主要可执行文件,然后再进行清理。