2013-05-13 46 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关键字锁定是一个更通用的解决方案。