StreamWriter何时处置?

时间:2018-11-21 19:55:52

标签: c# .net idisposable finalizer

我参加了一小堂课,以实现一个快速记录器。我用在构造函数中实例化的专用System.IO.StreamWriter组成了它。因为我使用的方式阻止了我实现using块,所以我添加了一个终结器,并在其中调用了StreamWriter的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 :(得分:4)

您只能在终结器中访问植根的对象(例如静态变量)或从CriticalFinalizerObject派生的对象。

问题在于终结器不是确定性的,它可以按其感觉的任何顺序运行。您遇到的问题是因为文本编写器在上课之前已完成。

您需要只是“希望最好”,然后让编写器的终结器完成工作,或者您需要重构代码,以便您的类本身是可处置的,并调用流编写器的dispose方法。