跨多個線程打開一個文件並向其中寫入流是否安全?如果沒有我可以實施的安全措施?File.Open跨線程寫入
回答
不,標準FileStream不是線程安全的。
您應該使用var safe = Stream.Synchronized(File.Open(...));
來創建一個線程安全的包裝。
有沒有這個實現的任何例子,我一直在搜索谷歌,但它並沒有證明是有成效的。 – user2372936 2013-05-13 16:26:43
你只需使用'Stream.Synchronized'創建包裝,然後像使用任何其他流一樣使用它。將它傳遞給另一個方法,在其上創建StreamReader/Writer等。 – 2013-05-13 17:24:41
謝謝!最後一個問題是否保留了我正在寫的內容?如果沒有,我該如何實現? – user2372936 2013-05-13 17:41:04
號這不是線程安全的。直觀地說,當索引是移動目標時,如何寫入文件?一種想法是創建單獨的文件並將它們與另一個進程結合起來,可能由某種完成的事件(例如,所有文件到達)觸發。
寫入多個線程的單個文件的概念有一些代碼異味。國際海事組織,重新審查你的選擇,並提出一種解決這個問題的不同方式。
我可以看到,在某種快速而簡單的日誌記錄功能中可能會這樣做,但這是一個很好的一點,即寫入具有多個線程的打開文件句柄可能表示設計模式不佳。在日誌編寫器的情況下,隊列可能是更好的方法。 – 2013-05-15 16:04:30
否;它本身並不安全,但是您可以使用lock
關鍵字來控制對FileStream對象的跨線程訪問。
例如:
FileStream fStream = File.Open('foo.txt', FileMode.Append);
lock (fStream)
{
// Some operation on fStream
}
發表Knaģis答案可能是在這種情況下要走的路,但互斥與lock
關鍵字鎖定是一個更通用的解決方案。
- 1. File.open,寫入並保存?
- 2. SQLite:跨線程共享連接讀取和寫入
- 3. 跨線程更新線程
- 4. 寫作與File.open YAML文件包線較長
- 5. unique_lock跨線程
- 6. Control.Refresh()跨線程
- 7. 通跨線程
- 8. VB.net跨線程
- 9. Mutithreading跨線程
- 10. 跨線程UI
- 11. 多線程執行寫入?
- 12. 異步流寫入線程
- 13. HDF5寫入線程併發
- 14. Java線程寫入文件
- 15. WPF跨線程消息框不阻止主線程輸入
- 16. 跨線程通信
- 17. 保留跨線程
- 18. 跨線程問題?
- 19. 跨線程操作
- 20. 跨線程控件
- 21. 跨線程調用
- 22. C#COM跨線程
- 23. 跨線程異常
- 24. 跨線程同步
- 25. 跨線程錯誤
- 26. 跨線程調用?
- 27. 跨線程反射
- 28. 跨線程操作
- 29. 跨線程的HTTPContext
- 30. 跨線程操作
你正在共享相同的流對象,還是試圖在每個線程中打開不同的流? – speckledcarp 2013-05-13 16:23:51
爲了節省您的理智,請不要這樣做。將所有寫入操作編組到由單個線程處理的隊列結構中。 – spender 2013-05-13 16:24:05