Получение NotSupportedException при записи из финализатора
Я пытаюсь запустить следующий код, используя Mono в Ubuntu 18.10:
public class X
{
public X() { Console.WriteLine("Ctor X"); }
~X() { Console.WriteLine("Finalizer X"); }
private static Y _myY = new Y();
}
public class Y
{
public Y() { Console.WriteLine("Ctor Y"); }
~Y() { Console.WriteLine("Finalizer Y"); }
}
public class Program
{
static void Main()
{
X x = new X();
}
}
Большую часть времени я получаю следующий вывод (всегда в таком порядке, хотя я думал, что он может время от времени меняться, поскольку порядок выполнения финализаторов не является детерминированным).
Ctor X
Ctor Y
Finalizer X
Finalizer Y
Но время от времени финализатор Y генерирует исключение System.NotSupportedException, которое, как представляется, происходит из метода FileStream.Write, который записывает в стандартный вывод.
Есть идеи, почему это может произойти? Я подумал, что, возможно, дескриптор стандартного вывода консоли закрыт перед запуском финализатора Y, но это только теория.
1 ответ
Это может быть связано с тем фактом, что порядок сбора является недетерминированным, то есть иногда Console
статический класс собирается раньше Y
,
Что касается порядка выполнения конструкторов и разрушителей, я думаю, что он всегда один и тот же, потому что:
Конструктор
X
всегда вызывается раньшеY
потому что по умолчаниюstatic
конструктор вызывается только когдаX
"тронут" впервые.Разрушитель
X
всегда вызывается раньшеY
потому чтоY
является статическим членом, то есть это долгоживущий экземпляр (например, Gen2).
Надеюсь, поможет!