2012-07-25 127 views
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有一個錯誤。重新啓動它,現在它每次都失敗[/編輯]

如何避免這種情況並正確關閉流?

+0

這可能是一個簡單的時間問題(Win Filesystem可能會很慢)。測試,也許在重新打開之前用'Thread.Sleep(10);'解決。 – 2012-07-25 11:10:38

+0

你的系統是多線程的嗎?非確定性使我思考競賽狀況,以及在不同線索(例如明確產生或通過事件產生的線索)中是否同時存在其中的兩種... – Chris 2012-07-25 11:11:25

+0

嗯。即使Thread.Sleep(1000)也不會有任何進展。 當然,我的系統是多線程的,但它是一個NUnit,並且確保一次只執行一個測試。所以這不是問題。 – hellow 2012-07-25 11:21:12

回答

0

它看起來就像是我的錯。 SyncFileWriter派生自抽象類,用於檢查文件是否存在。如果不是,它會初始化這個文件有一些默認的東西,這就是爲什麼我做了以下

File.Create(filename); 

正如你看到的,我創建了一個文件,但File.Create打開一個流,離開它後不關閉範圍,不管。 現在我這樣做:

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

一切都很好。

我認爲這裏還存在第一個非確定性行爲的問題,因爲它只是這樣做,當一個參數爲空時,並且在創建新文件時它僅爲空。

無論如何,感謝您的幫助!

-1

不太清楚你想要什麼來實現的,但我想這可能會幫助:http://www.blackwasp.co.uk/UsingStatement.aspx

+0

不。我喜歡獲取文件的所有權,並且一直使用流,因此我在自己的類中封裝了一些其他內容。而我試圖歸檔的就是我所說的。我嘗試使用流並關閉它;) – hellow 2012-07-25 11:20:50