我参加了一小堂课,以实现一个快速记录器。我用在构造函数中实例化的专用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);
}
}
答案 0 :(得分:4)
您只能在终结器中访问植根的对象(例如静态变量)或从CriticalFinalizerObject派生的对象。
问题在于终结器不是确定性的,它可以按其感觉的任何顺序运行。您遇到的问题是因为文本编写器在上课之前已完成。
您需要只是“希望最好”,然后让编写器的终结器完成工作,或者您需要重构代码,以便您的类本身是可处置的,并调用流编写器的dispose方法。