3

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

4

2 回答 2

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。你必须自己处理你的对象。

于 2013-04-22T14:09:06.373 回答
1

我不认为一切都在实现IDisposable接口时做它应该做的事情。

例如,如果您在using子句中打开连接,则使用 Microsoft Access 数据库连接 (OleDb) 将永远不会关闭该连接。

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

于 2013-04-22T13:56:46.247 回答