是否在程序终止时自动清除所有未手动清除的对象
本文关键字:清除 对象 终止 是否 程序 | 更新日期: 2023-09-27 18:09:20
FileStream, CryptoStream等对象…否则我必须手动处理它们。
我正在使用线程。IsBackground = true,当用户点击表单关闭按钮时终止我的工作线程
让我们把它分解成多个问题:
当我的程序终止时,操作系统资源(如文件句柄)会自动关闭吗?
一般来说,是的。当进程被销毁时,操作系统将自动关闭与该进程相关的所有资源。
假设我有非操作系统资源,比如数据库连接。我的应用程序会自动向数据库发送连接关闭的消息吗?
不一定。但是,数据库应该编写得在面对不稳定的客户机时是健壮的。
我应该清理我的资源,即使我不需要?
在"正常"关机情况下,是的。假设将来发生资源泄漏。如果你有良好的纪律,并且总是在使用完资源后释放资源,那么找到漏洞就会容易得多。以有序的方式关闭程序。
在"紧急"关机时,只要尽快关机即可。如果程序由于某些致命错误而崩溃,尝试清理可能只会使情况变得更糟。在建筑物倒塌之前,不要花时间扫地。
是否所有对象[…]程序终止时自动处理?
是的。最终,所有非托管资源都是从操作系统(Windows)分配的,当一个进程终止时,它的所有资源都被释放。但这并不意味着你所有的Dispose()
方法都会被调用,你不能保证它们会被调用。所以不要放任何重要的东西。
所有对象将自动处置,如果没有手动处置....在未来一个不确定的时间。
假设它们构建正确
在某些情况下,终结器将不运行,例如,如果从终结器抛出异常,或者调用Environment.FailFast()
。
所以肯定不是你可以依赖的
您可能还想将此添加到Main()
方法的末尾:
GC.Collect();
GC.WaitForPendingFinalizers();
然而,我认为任何依赖于的代码都是坏的。