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でエラーが発生したようです。再起動すると、毎回失敗します[/ edit]

これを回避してストリームを適切に閉じる方法は?

4

2 に答える 2

0

それは私のせいだったようです。SyncFileWriterは、ファイルが存在するかどうかをチェックする抽象クラスから派生しています。そうでない場合は、このファイルをいくつかのデフォルトのもので初期化します。そのため、私は次のことを行いました

File.Create(filename);

ご覧のとおり、私はファイルを作成しますが、File.Createはストリームを開き、スコープを離れた後は閉じません。今私はこれを行います:

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

そして、すべてが大丈夫です。

ここに、最初の非決定論的動作の問題もあると思います。これは、パラメーターがnullの場合にのみ実行され、新しいファイルを作成するときにnullのみが実行されるためです。

とにかく、あなたの助けをありがとう!

于 2012-07-25T11:40:15.890 に答える
-1

何を達成しようとしているのかよくわかりませんが、これが役立つと思います:http ://www.blackwasp.co.uk/UsingStatement.aspx

于 2012-07-25T11:08:34.437 に答える