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 方法。
我有一个小的 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 方法。