Когда утилизируется StreamWriter? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть небольшой класс, который я собрал, чтобы реализовать быстрый регистратор.Я сочинил его с частным System.IO.StreamWriter, который был создан в конструкторе.Поскольку используемый мной способ не позволяет реализовать блок using, я добавил финализатор и вызвал в нем метод StreamWriter's Dispose().Однако при выполнении этот финализатор создает исключение, поскольку StreamWriter уже был удален.

System.ObjectDisposedException - Невозможно получить доступ к закрытому файлу.

Я запуталсякак это произошло, и мне интересно, означает ли это, что мне не нужно беспокоиться об очистке StreamWriter.Вот мой класс:

public class TextFileLogger : AbstractTextLogger
{
    private const string LogPath = @"C:\";
    private const string LogFileName = "MyFile.log.txt";
    private readonly StreamWriter _writer;

    public TextFileLogger()
    {
        _writer = new StreamWriter($"{LogPath}{LogFileName}", true);
        _writer.AutoFlush = true;
    }

    ~TextFileLogger()
    {
        _writer.Dispose();
    }

    protected override void WriteLine(string line)
    {
        _writer.WriteLine(line);
    }
}

1 Ответ

0 голосов
/ 21 ноября 2018

Единственные вещи, к которым вам разрешен доступ в финализаторе, - это объекты с корнем (например, статические переменные) или объекты, производные от CriticalFinalizerObject.

Проблема заключается в том, что финализатор не является детерминированным, ему разрешенобегать в любом порядке.Проблема, с которой вы столкнулись, заключается в том, что средство записи текста было завершено перед вашим классом.

Вам нужно либо просто «надеяться на лучшее» и позволить финализатору автора выполнить свою работу, либо вам необходимо провести рефакторинг кода.таким образом, ваш класс сам по себе может быть утилизирован, и это вызывает метод dispose для средства записи потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...