我目前正在使用.NET Compact Framework 3.5中的TextWriter类将日志条目写入文件。这是一个非常普通和简单的任务,没有问题。但是,当写入所有数据时,使用TextWriter并调用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 Compact Framework 3.5
答案 0 :(得分:2)
我只是使用Reflector来查看CF 3.5 BCL中的TextWriter。
这是您要调用的Dispose:
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
所以这是调用参数化的Dispose,如下所示:
protected virtual void Dispose(bool disposing)
{
}
因此有关于为什么派生的StreamWriter没有获得Disposed的解释 - TextWriter不会在其包含的StreamWriter上调用Dispose。你必须亲自处理你的对象。
答案 1 :(得分:1)
我不认为一切都在实现IDisposable
接口时应该做的事情。
例如,如果在using
子句中打开连接,则使用Microsoft Access数据库连接(OleDb)将永远不会关闭连接。
我的猜测是你找到了另一个控件,它没有做它应该做的所有事情。