Чтобы упростить задачу, предположим, что у меня есть простое определение класса внутри деструктора внутриСтранное поведение деструктор вызывается дважды, но пропустить выполнение кода в первый раз
public class MyDisposeFinalize
{
~MyDisposeFinalize()
{
var breakPoint = string.Empty;
}
}
В методе Main
я сначала создать экземпляр MyDisposeFinalize
класса, затем присвойте null
моему экземпляру и вызовите сборку мусора.
static void Main(string[] args)
{
var myDispose = new MyDisposeFinalize();
myDispose = null;
GC.Collect();
System.Console.ReadKey();
}
Я ожидаю, что мой деструктор будет называться один раз, когда очередь финализации завершается.
В самом деле, когда я ставлю точку останова внутри моего метода деструктора на входе, внутри и выхода у меня есть очень странное поведение:
- Точка входа перерыва удар
- Затем снова точка входа перерыв хит
- Внутри останов ударил
- Выход точка останова хит
- Затем снова точка входа перерыв ударил
Первая идея заключалась в том, что для выполнения деструкторного метода приходят два разных потока, но тогда почему один из них пропускает код метода и выполняет его только на второй итерации? И вообще, почему дескриптор вызывается дважды?
Что вы подразумеваете под «точкой разрыва внутри моего деструктора при входе»? Я никогда не ставил точку останова перед первым утверждением метода. Помещение точки останова на прототипе метода бессмысленно и зависит от компилятора. – AhmadWabbi
Я думаю, что получаю это сейчас - OP ставит точку останова на фигурные скобки до и после строки кода. – Baldrick
@AhmadWabbi Да, я поставил точку останова на фигурные фигурные скобки, внутри метод и на выходе фигурные скобки. –