为什么我的被覆盖的Dispose没有被调用?

时间:2013-04-17 14:37:48

标签: c# .net compact-framework override dispose

我目前正在使用.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

2 个答案:

答案 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)将永远不会关闭连接。

我的猜测是你找到了另一个控件,它没有做它应该做的所有事情。