2015-10-06 2 views
0

Следующий destructor код в desctructorCheck класс закрывает консоль через почти 2 секунды, прежде чем получать какие-либо данные от пользователя.Деструктор заканчивается перед выполнением задачи в C#?

~destructorCheck() { 
    Console.WriteLine("Destructor"); 
    Console.ReadLine(); 
} 

Почему это закрытие? Do У деструктора есть какой-либо таймер, чтобы закончить процесс его очистки?

+3

Вы должны читать сообщения Эрика Липперта на [финализаторах] (http://ericlippert.com/2015/05/18/when-everything-you-know-is-wrong-part-one/) – juharr

+1

Связанный: http : //blog.stephencleary.com/2009/08/finalizers-at-process-exit.html –

+0

@all Спасибо за ваши быстро понятные ответы и за ваших рефералов. –

ответ

2

Да. Финализаторы имеют ограниченное количество времени для запуска до их прекращения.

Это одна из многих причин, по которым финализаторы являются инструментом последней инстанции. Они не гарантированно работают в первую очередь и не гарантируются. Они работают только потому, что Framework действительно нуждается в этом объекте, чтобы уйти сейчас - это либо GC'ing, потому что ему нужна память, либо приложение закрывается.

Я уверен, что срок составляет ~ 2 секунды, и я не знаю, как это изменить.

+1

Я бы не изменил его, если бы мог! –

+1

Я тоже, но это, как правило, непосредственный последующий вопрос от людей, которые действительно хотят злоупотреблять ими. :) –

2

Причина в том, из-за того, как называются деструкторы:

Цитирую MSDN:

«Программист не имеет никакого контроля над тем, когда называется деструктор, поскольку это определяется сборщиком мусора , Мусор коллекционер проверяет объекты, которые больше не используются в приложении . Если он считает объект, подлежащий уничтожению, он вызывает деструктор (если есть) и восстанавливает память, используемую для хранения объекта . Деструкторы также вызывается, когда программа выходит. '

Я согласен с тем, что чтение блога Эрика Липперта - это хорошо!

Если вам нужно, чтобы что-то произошло, когда ваш объект C# был уничтожен, вероятно, вы должны реализовать IDisposable и поместить свою логику замыкания в метод Dispose.

+0

Это, к сожалению, вводящий в заблуждение бит текста из MSDN, поскольку это подразумевает, что во-первых, GC вызывает деструктор во время трассировки, а во-вторых, что уничтожение восстанавливает память. Более точное описание будет состоять в том, что GC идентифицирует конечные объекты и * сохраняет их в живых для потока финализатора для обработки *. –