为什么我的被重写的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

为什么我的被重写的Dispose没有被调用

我刚刚使用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子句中打开它。

我猜这是你发现另一个控件不做它应该做的一切