跨多个线程打开一个文件并向其中写入流是否安全?如果没有我可以实施的安全措施?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. 写作与File.open YAML文件包线较长
- 4. VB.net跨线程
- 5. Control.Refresh()跨线程
- 6. 跨线程UI
- 7. unique_lock跨线程
- 8. HDF5写入线程并发
- 9. 异步流写入线程
- 10. Java线程写入文件
- 11. WPF跨线程消息框不阻止主线程输入
- 12. C#COM跨线程
- 13. 跨线程问题?
- 14. 跨线程反射
- 15. 跨线程调用
- 16. 跨线程同步
- 17. 跨线程的HTTPContext
- 18. 跨线程控件
- 19. 跨线程通信
- 20. 跨线程异常
- 21. 与Rspec Stubbing File.open
- 22. Winforms/ActiveX跨线程调用
- 23. Qt跨线程调用
- 24. 跨线程调用(c#,WaveEngine)
- 25. 跨线程操作控制
- 26. Python:跨功能线程
- 27. 跨线程分配属性
- 28. 跨线程交互c#
- 29. 跨线程操作无效
- 30. 跨线程操作无效:
你正在共享相同的流对象,还是试图在每个线程中打开不同的流? – speckledcarp 2013-05-13 16:23:51
为了节省您的理智,请不要这样做。将所有写入操作编组到由单个线程处理的队列结构中。 – spender 2013-05-13 16:24:05