我在處理單聲道流時遇到了一個真正奇怪的問題。 我打開一個流是這樣的:放棄流/文件的所有權
_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有一個錯誤。重新啓動它,現在它每次都失敗[/編輯]
如何避免這種情況並正確關閉流?
這可能是一個簡單的時間問題(Win Filesystem可能會很慢)。測試,也許在重新打開之前用'Thread.Sleep(10);'解決。 – 2012-07-25 11:10:38
你的系統是多線程的嗎?非確定性使我思考競賽狀況,以及在不同線索(例如明確產生或通過事件產生的線索)中是否同時存在其中的兩種... – Chris 2012-07-25 11:11:25
嗯。即使Thread.Sleep(1000)也不會有任何進展。 當然,我的系統是多線程的,但它是一個NUnit,並且確保一次只執行一個測試。所以這不是問題。 – hellow 2012-07-25 11:21:12