在Using Block中调用Environment.Exit()

如果我有一个控制台应用程序,其代码如下:

using (DisposableObject object = new DisposableObject()) { if (a condition) Environment.Exit(0); // Do Stuff } 

我的物体会被妥善处理吗? 或者在清理对象之前线程是否死亡?

您的应用程序将终止,并且此时将释放所有托管内存。

生成的finally块将不会执行,因此不会调用任何Dispose方法,因此很可能不会释放任何非托管资源。

请参阅不要盲目依赖终结器 。

当应用程序退出时,通常会清理操作系统知道的资源。 通常不会清理操作系统不知道的资源。

例如,一些使用数据库并且需要实现与数据库服务器直接支持的任何内容不同的锁定范例的程序可以使用一个或多个“LockedResources”表来跟踪应该锁定哪些资源。 需要获取资源的代码将锁定“LockedResources”表,更新它以显示需要锁定的资源,然后释放它; “LockedResource”表上的操作通常非常快(因此“LockedResource”表将仅短暂锁定),即使应用程序需要长时间保存真实资源。 但是,如果应用程序执行Environment.Exit而“LockedResources”表表明它拥有资源,则操作系统将不知道如何更新“LockedResources”表以取消此类所有权。

通常,即使客户端应用程序意外死亡,数据库应用程序之类的东西也应设计为健壮的。 例如,可能有一个活动客户端表,每个活动客户端都在一个标识自己的记录上持有锁。 如果想要使用资源的客户端注意到“LockedResources”表已将其签出给其他客户端,则前一个客户端可以检查以确保后一个客户端在“活动客户端”表中的条目仍然被锁定。 如果没有,它可能会发现有问题的客户已经死亡并采取适当的行动(认识到死亡的客户可能使其资源处于不良状态)。 另一方面,如果客户端意外死亡,数据库设计为健壮的事实并不意味着它们总是如此。 放弃资源并不是一件好事,即使它通常可以存活的。