2013-05-13 26 views
1

跨多個線程打開一個文件並向其中寫入流是否安全?如果沒有我可以實施的安全措施?File.Open跨線程寫入

+0

你正在共享相同的流對象,還是試圖在每個線程中打開不同的流? – speckledcarp 2013-05-13 16:23:51

+3

爲了節省您的理智,請不要這樣做。將所有寫入操作編組到由單個線程處理的隊列結構中。 – spender 2013-05-13 16:24:05

回答

3

不,標準FileStream不是線程安全的。

您應該使用var safe = Stream.Synchronized(File.Open(...));來創建一個線程安全的包裝。

Stream.Synchronized() on MSDN

+0

有沒有這個實現的任何例子,我一直在搜索谷歌,但它並沒有證明是有成效的。 – user2372936 2013-05-13 16:26:43

+0

你只需使用'Stream.Synchronized'創建包裝,然後像使用任何其他流一樣使用它。將它傳遞給另一個方法,在其上創建StreamReader/Writer等。 – 2013-05-13 17:24:41

+0

謝謝!最後一個問題是否保留了我正在寫的內容?如果沒有,我該如何實現? – user2372936 2013-05-13 17:41:04

1

號這不是線程安全的。直觀地說,當索引是移動目標時,如何寫入文件?一種想法是創建單獨的文件並將它們與另一個進程結合起來,可能由某種完成的事件(例如,所有文件到達)觸發。

寫入多個線程的單個文件的概念有一些代碼異味。國際海事組織,重新審查你的選擇,並提出一種解決這個問題的不同方式。

+0

我可以看到,在某種快速而簡單的日誌記錄功能中可能會這樣做,但這是一個很好的一點,即寫入具有多個線程的打開文件句柄可能表示設計模式不佳。在日誌編寫器的情況下,隊列可能是更好的方法。 – 2013-05-15 16:04:30

1

否;它本身並不安全,但是您可以使用lock關鍵字來控制對FileStream對象的跨線程訪問。

例如:

FileStream fStream = File.Open('foo.txt', FileMode.Append); 

lock (fStream) 
{ 
    // Some operation on fStream 
} 

發表Knaģis答案可能是在這種情況下要走的路,但互斥與lock關鍵字鎖定是一個更通用的解決方案。