#c# #asp.net
#c# #asp.net
Вопрос:
Это вопрос для собеседования, с которым мне нужна помощь.
У вас есть следующее ASP.NET класс, лежащий в основе кода:
public partial class Page1 : Page
{
private string _value;
public Page1()
{
if (DateTime.Now.Ticks % 10 == 0)
_value = "Test";
}
~Page1()
{
if(_value.Equals("Test"))
_value = string.Empty;
}
}
Каждый раз, когда кто-то запрашивает эту страницу, w3wp.exe
процесс неожиданно завершается.
-
Почему это происходит, когда пользователь видит желтый экран смерти (по умолчанию ASP.NET страница ошибки)?
-
Почему в управляемой куче всегда присутствует исключение OutOfMemoryException?
Комментарии:
1. быстро? Вы сейчас на собеседовании?
2. И если установить флажок % 10 != 0, то _value будет равно null. Вы разыменовали его.
Ответ №1:
Подсказка: никогда не создавайте исключения в деструкторе / финализаторе, иначе вы уничтожите поток, в котором выполняется GC, а без GC все может стать некрасиво.
Хотя в .NET 1.1 существовала некоторая терпимость к исключениям, создаваемым в фоновых потоках, которые были использованы и не привели бы к остановке процесса хостинга, начиная с CLR 2.0 это больше не так. Цитата из документа:
Если Finalize или переопределение Finalize генерирует исключение, а среда выполнения не размещена приложением, которое переопределяет политику по умолчанию, среда выполнения завершает процесс, и никакие активные блоки try-finally или завершающие средства не выполняются. Такое поведение обеспечивает целостность процесса, если завершитель не может освободить или уничтожить ресурсы.
Исключение в финализаторе является фатальным.