11

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

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

   // Do Stuff
}

我的物品会被妥善处理吗?还是在清理对象之前线程死了?

4

2 回答 2

10

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

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

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

于 2012-10-31T19:09:41.500 回答
1

操作系统知道的资源通常会在应用程序退出时被清理。操作系统不知道的资源一般不会被清理。

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

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

于 2012-11-01T15:12:39.600 回答