Вызов среды. Exit() в пределах используемого блока

Если у меня есть консольное приложение с кодом вроде:

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

   // Do Stuff
}

Будет ли мой объект правильно настроен? Или нить умирает до того, как объект будет очищен?

Ответ 1

Ваше приложение будет завершено, и вся управляемая память будет выпущена в этот момент.

Сгенерированный блок finally не будет выполняться, поэтому любые методы Dispose не будут вызываться, поэтому любые не управляемые ресурсы могут быть очень не удалены.

Смотрите Не слепо рассчитывайте на финализаторе.

Ответ 2

Ресурсы, о которых знает операционная система, обычно очищаются при выходе приложения. Ресурсы, о которых не знает операционная система, обычно не очищаются.

Например, некоторые программы, которые используют базу данных и нуждаются в реализации парадигмы блокировки, которая отличается от всего, что поддерживает сервер баз данных, могут использовать одну или несколько таблиц "LockedResources" , чтобы отслеживать, какие ресурсы должны быть заблокированы. Код, который должен получить ресурс, заблокирует таблицу "LockedResources" , обновит его, чтобы показать, какие ресурсы необходимо заблокировать, а затем отпустите; эта операция в таблице "LockedResource" будет, как правило, довольно быстрой (так что таблица "LockedResource" будет заблокирована только ненадолго), даже если приложению необходимо долгое время удерживать реальный ресурс. Если, однако, приложение выполняет Environment.Exit, в то время как в таблице "LockedResources" указано, что он владеет ресурсом, операционная система не будет знать, как обновить таблицу "LockedResources" , чтобы отменить такое право собственности.

В целом, такие вещи, как приложения баз данных, должны быть разработаны, чтобы быть надежными, даже если клиентское приложение неожиданно умирает. Например, может быть таблица активных клиентов, причем каждый активный клиент имеет блокировку записи, которая идентифицирует себя. Если клиент, который хочет использовать ресурс, замечает, что таблица "LockedResources" проверила его на каком-то другом клиенте, первый клиент мог проверить, чтобы последняя запись клиента в таблице "активные клиенты" все еще заблокирована. Если нет, то может показаться, что клиент, о котором идет речь, умер и принял соответствующие меры (признав, что умерший клиент оставил свой ресурс в плохом состоянии). С другой стороны, тот факт, что база данных должна быть спроектирована так, чтобы быть надежной, если клиенты умирают неожиданно, не означает, что они всегда есть. Отказ ресурсов - это не очень хорошо, даже если он обычно выживает.