Подтвердить что ты не робот

Выполнить код при выходе из отладчика VisualStudio

Я предполагал, что при прекращении отладки (например, нажатием кнопки "Стоп" или нажатием Shift + F5) любой класс, реализующий финализатор или IDisposable будет уничтожен.

У меня есть несколько классов, которые реализуют IDisposable. Есть несколько вещей, которые я хотел бы (попробовать) и сделать, когда приложение выходит из отладчика (или из-за сбоя в работе). Прямо сейчас Dispose(), по-видимому, не вызывается, и не финализатор ~MyClass(){}

Есть ли способ сделать это?

4b9b3361

Ответ 1

Для нормальной остановки служб Windows вы должны поместить свой код в свой метод Stop.

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.stop.aspx

В целом, грубые прерывания потока и грубые выгрузки домена приложения не будут запускать "нормальные" финализаторы - вы можете получить более подробную информацию в этой статье MSDN.

https://web-beta.archive.org/web/20150423173148/https://msdn.microsoft.com/en-us/magazine/cc163716.aspx

До этого момента я просто говорил о прерываниях потока в результате выполнения потока ThreadAbortException в потоке. Как правило, это приведет к прекращению потока. Тем не менее, поток может обрабатывать прерывание потока, предотвращая его завершение потока. Чтобы учесть это, среда выполнения обеспечивает более мощное действие, метко названное "грубый поток" прерывается. Отказ от грубой нити приводит к прекращению выполнения потока. Когда это происходит, CLR не гарантирует, что будет выполняться какой-либо код возврата в потоке (если только код не выполняется в CER). Грубо, действительно.

Аналогично, в то время как типичная разгрузка домена приложения будет изящно прервать все потоки в домене, грубая выгрузка домена приложения будет грубо прервать все потоки в домене и не гарантирует, что обычные финализаторы, связанные с объектами в этом домене, будут работать. SQL Server 2005 - это один CLR-хост, который использует грубые прерывания потока и грубый отладки домена приложения как часть своей политики эскалации. Когда возникает асинхронное исключение, отказ в распределении ресурсов будет обновлен до прерывания потока. И когда происходит прерывание потока, если оно не завершится в течение временного интервала, установленного SQL Server, оно будет обновлено до отказа грубой нити. Аналогичным образом, если операция разгрузки домена приложения не заканчивается в течение времени, установленного SQL Server, она будет обновлена ​​до грубой разгрузки домена приложения. (Обратите внимание, что только что выложенные политики не совсем то, что использует SQL Server, так как SQL Server также учитывает, выполняется ли код в критических областях, но больше на эту тему).

Ответ 2

Ну, CLR не делает никаких promises в отношении того, когда ваши объекты собираются или удаляются.

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

Лучше всего использовать ваши объекты IDisposable внутри блока using.
Это единственный раз, когда вам гарантируется, когда они будут уничтожены.