Получение 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).

Надеюсь, поможет!

Другие вопросы по тегам