Страницы

Поиск по вопросам

среда, 3 октября 2018 г.

Почему поток выходит из деструктора, содержащего бесконечный цикл

Почему приложение завершает свою работу? Ведь в деструкторе должно быть зацикливание:
namespace Core { class Test { ~Test() { while (true); } }
class Program { static void Main(string[] args) { Test test = new Test(); } } }


Ответ

Потому что в C# деструктор (а точнее, финализатор, так он называется) работает по-другому. Он вызывается не сразу, а когда-нибудь потом, да и то лишь при условии, что сборщик мусора удалит объект. Поскольку запуск сборщика мусора не гарантирован, то и вызов вашего финализатора тоже не гарантирован.
Кроме того, финализаторы бегут в отдельном потоке, а если в конце работы приложения финализация бежит слишком долго, то она насильно обрывается.
В вашем случае программа короткая и не нагружает память, понятно, что сборщик мусора запущен скорее всего не будет.

Для нужной вам семантики гарантированного вызова метода для уничтожения объекта вам нужно реализовать интерфейс IDisposable и воспользоваться конструкцией using
class Test : IDisposable { public void Dispose() { while (true) ; } }
class Program { static void Main(string[] args) { using (Test test = new Test()) { } } }

Дополнительная информация по теме:
Как и когда нужно имплементировать IDisposable? Восстановление объектов в C# When everything you know is wrong, part one и part two

Комментариев нет:

Отправить комментарий