1

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

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

4

4 回答 4

7

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

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

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

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

不必要。但是,在面对不稳定的客户端时,应该将数据库编写为健壮的。

我是否应该清理我的资源,即使我不需要?

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

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

于 2013-04-14T16:10:37.570 回答
3

程序终止时是否所有对象 [...] 都会被自动处理?

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

于 2013-04-14T15:56:17.193 回答
0

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

假设它们是正确构建的。

于 2013-04-14T15:53:58.773 回答
0

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

所以这当然不是你可以依赖的东西。

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

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

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

于 2013-04-14T16:10:55.920 回答