为什么我的被重写的Dispose没有被调用
本文关键字:Dispose 调用 我的 重写 为什么 | 更新日期: 2023-09-27 18:09:45
我目前正在使用。net Compact Framework 3.5中的textwwriter类将日志条目写入文件。这是一个非常普通和简单的任务,没有问题。但是使用textwwriter并在所有数据写入后调用Dispose会导致文件保持打开状态。
我的方法是初始化一个FileStream,然后使用创建的FileStream实例初始化一个StreamWriter。然后,我使用静态方法synchronized创建了一个同步的TextWriter。
为了调查为什么我的文件不能被另一个进程访问后,数据已经写入和刷新,我从StreamWriter派生了一个类与Dispose方法的覆盖,只是为了看看它是否被调用。运行代码显示未调用覆盖的Dispose方法,这使我感到困惑。
主叫号码为:
var fileStream = new FileStream("''NAND_FLASH''test.file", FileMode.OpenOrCreate);
var streamWriter = new ExtendedWriter(fileStream, Encoding.UTF8);
TextWriter textWriter = TextWriter.Synchronized(streamWriter);
textWriter.Dispose();
和派生类:
internal class ExtendedWriter : StreamWriter
{
public ExtendedWriter(Stream stream) : base(stream)
{
}
public ExtendedWriter(Stream stream, Encoding encoding) : base(stream, encoding)
{
}
public ExtendedWriter(Stream stream, Encoding encoding, int bufferSize) : base(stream, encoding, bufferSize)
{
}
public ExtendedWriter(string path) : base(path)
{
}
public ExtendedWriter(string path, bool append) : base(path, append)
{
}
public ExtendedWriter(string path, bool append, Encoding encoding) : base(path, append, encoding)
{
}
public ExtendedWriter(string path, bool append, Encoding encoding, int bufferSize) : base(path, append, encoding, bufferSize)
{
}
protected override void Dispose(bool disposing)
{
Trace.WriteLine("Extended writer dispose!");
base.Dispose(disposing);
}
}
谁能给我解释一下这种行为?编辑:更新了问题文本,我忘了提到我正在使用。net紧凑框架3.5
我刚刚使用Reflector来查看CF 3.5 BCL中的TextWriter。
这是你调用的Dispose:
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
调用了参数化的Dispose,看起来像这样:
protected virtual void Dispose(bool disposing)
{
}
所以有解释为什么你的派生StreamWriter没有得到Dispose - TextWriter不调用Dispose对其包含的StreamWriter。你必须自己处理你的对象
我不认为每样东西在实现IDisposable
接口时都能做它应该做的事情。
例如,使用Microsoft Access数据库连接(OleDb)将永远不会关闭连接,如果你在using
子句中打开它。
我猜这是你发现另一个控件不做它应该做的一切