StreamWriter 什么时候被释放?

When is StreamWriter disposed?

我有一个小的 class 我拼凑起来实现一个快速记录器。我用一个在构造函数中实例化的私有 System.IO.StreamWriter 组成它。因为我使用的方式阻止我实现 using 块,所以我添加了一个终结器并在其中调用了 StreamWriter 的 Dispose() 方法。但是,在执行时,该终结器会抛出异常,因为 StreamWriter 已被释放。

System.ObjectDisposedException - Cannot access a closed file.

我很困惑这是怎么发生的,我想知道这是否意味着我不需要担心清理 StreamWriter。这是我的 class:

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);
    }
}

您唯一可以在终结器中访问的对象是根对象(如静态变量)或派生自 CriticalFinalizerObject 的对象。

问题是终结器不是确定性的,它可以按照感觉的任何顺序 运行。您 运行 遇到的问题是因为文本编写器在您 class.

之前完成

您只需要 "hope for the best" 并让编写器的终结器完成工作,或者您需要重构您的代码,以便您的 class 本身是可处置的,并调用流编写器的 dispose 方法。