调用Environment.Exit()范围内的使用块(Calling Environment.Ex

2019-07-03 11:47发布

如果我有像代码控制台应用程序:

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

   // Do Stuff
}

请问我的对象得到妥善处置? 抑或是线程死对象清理过吗?

Answer 1:

你的应用程序将终止与所有被管理的内存将在该点被释放。

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

见不上一个终结盲目计数 。



Answer 2:

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

例如,它使用一个数据库和一些程序需要实现锁定模式是从什么不同数据库服务器直接支持可以使用一个或多个“LockedResources”表来跟踪哪些资源应该被锁定。 这需要获取的资源将锁定“LockedResources”表,更新它显示的资源需要加以锁定,然后松开代码; 对“LockedResource”表操作通常会相当快(所以“LockedResource”表将锁定只简单地),即使在应用程序需要持有真正的资源很长一段时间。 但是,如果该应用程序确实的Environment.Exit而“LockedResources”表说,它拥有的资源,操作系统将不知道如何更新“LockedResources”表中取消这种所有权。

一般来说,像数据库应用程序的设计应该是,即使客户端应用程序意外终止强劲。 例如,有可能是活动的客户端的一个表,其中每个活动的客户端保持在其自身识别的记录的锁。 如果想要使用资源的客户机注意到“LockedResources”表已签出一些其他的客户端,前者客户端可以检查,以确保后者客户的“有效客户”表条目仍处于锁定状态。 如果不是,它可以计算有问题的客户端已经死了,并且采取适当的行动(承认已经死了,客户端可能在一个糟糕的状态已经离开了它的资源)。 在另一方面,事实上,数据库的设计是稳健的,如果客户意外死亡并不意味着他们总是有。 资源放弃是不是一件好事,即使是生存。



文章来源: Calling Environment.Exit() Within a Using Block