1

在使用单声道流时,我遇到了一个非常奇怪的问题。我打开这样的流:

_stream = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);

其中 _stream 当然是 FileStream。我为这个类添加了一个 dispose 方法,如下所示:

public override void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

private void Dispose(bool disposing)
{
    if(!_disposed)
    {
        if(disposing)
        {
            _stream.Flush(true);
            _stream.Dispose();
            _items.Clear();
        }
        _disposed = true;
    }
}

现在我有这个简单的测试:

[Test]
public void SimpleTest()
{
    SyncFileWriter s = new SyncFileWriter("file");
    s.Save("a", "b");
    s.Dispose();

    SyncFileWriter s2 = new SyncFileWriter("file");
    s2.Dispose();
}

但如果因 IOException 失败:共享冲突。[编辑]看来monodevelop有错误。重新启动它,现在它每次都失败[/编辑]

如何避免这种情况并正确关闭流?

4

2 回答 2

0

看来是我的错。SyncFileWriter 派生自一个检查文件是否存在的抽象类。如果没有,它将使用一些默认内容初始化此文件,这就是我执行以下操作的原因

File.Create(filename);

如您所见,我创建了一个文件,但是 File.Create 打开了一个流并且在离开它的范围后没有关闭它,无论如何。现在我这样做:

Filestream f = File.Create(filename);
...
f.Dispose();

一切都很好。

我认为这也是第一个非确定性行为的问题所在,因为它仅在参数为空时才这样做,并且它仅在您创建新文件时为空。

无论如何,感谢您的帮助!

于 2012-07-25T11:40:15.890 回答
-1

不太确定您要达到的目标,但我想这可能会有所帮助: http: //www.blackwasp.co.uk/UsingStatement.aspx

于 2012-07-25T11:08:34.437 回答