程序终止时是否自动处理所有未手动处理的对象?

时间:2013-04-14 15:52:29

标签: c# multithreading dispose

像FileStream,CryptoStream等对象...... 或者我必须手动处理它们。

当用户点击表单关闭按钮时,我正在使用Thread.IsBackground = true来终止我的工作线程。

4 个答案:

答案 0 :(得分:7)

让我们将其分解为多个问题:

  

当我的程序终止时,文件句柄等操作系统资源会自动关闭吗?

一般来说,是的。当进程被销毁时,操作系统将自动关闭与进程关联的所有资源。

  

假设我有非操作系统资源,例如数据库连接。我的应用程序会自动向数据库发送一条消息,说明连接已关闭吗?

不一定。但是,面对一个不稳定的客户端,应该编写数据库以保持健壮。

  

即使我不需要,我应该清理资源吗?

在“正常”关机中,是的。假设您将来有资源泄漏。如果你有良好的纪律并且在你完成它们时总是释放你的资源,那么找到泄漏会容易得多。以有序的方式关闭您的程序。

在“紧急”关机时,请尽快关闭。如果程序由于某些致命错误而停止运行,那么尝试清理可能会使情况变得更糟。在建筑物倒塌之前,不要花时间扫地。

答案 1 :(得分:3)

  

程序终止时是否自动处理所有对象?

是。最终,所有非托管资源都从操作系统(Windows)分配,当进程终止时,所有资源都将被释放。但这并不意味着你的所有Dispose()方法都会被调用,你无法保证它们。所以不要在那里放任何重要的东西。

答案 2 :(得分:0)

如果未在未来的不确定时间手动处置,所有对象将自动处理。

假设它们构建正确。

答案 3 :(得分:0)

有些情况下终结器将运行,例如,如果从终结器抛出异常,或者某些东西调用Environment.FailFast()

所以它肯定是不是你可以依赖的东西。

您可能还想将此添加到Main()方法的末尾:

GC.Collect();
GC.WaitForPendingFinalizers();

但是,我认为任何依赖于此的代码都是已损坏