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