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