并发文件写入

时间:2009-07-21 16:19:00

标签: c# logging concurrency

如何写入可由多个源访问的文本文件(可能以并发方式),确保不会丢失写入操作?

就像,如果两个不同的进程在同一时刻写入文件,这可能会导致问题。简单的解决方案(不是非常快速而且不是非常优雅)将在开始进程(创建.lock文件或类似文件)时锁定文件并在写入完成时释放它(删除锁定)。

开始写时,我会检查.lock文件是否存在并延迟写入,直到文件被释放。

对于这种情况,建议使用的模式是什么?

由于

修改 我的意思是流程,例如来自不同客户端的不同程序,不同用户等,而不是同一程序中的线程

6 个答案:

答案 0 :(得分:2)

考虑使用简单的数据库。您将获得所有这些内置安全性相对容易。

答案 1 :(得分:2)

同步进程间访问的最快方法是使用Mutexes / Semaphores。该线程回答了如何使用它们来模拟读写器锁模式: Is there a global named reader/writer lock?

答案 2 :(得分:1)

我建议使用ReaderWriterLock。它专为多个读者设计,但确保只有一个作者可以在任何时间编写数据MSDN

答案 3 :(得分:1)

为了做到这一点,我会看Command Pattern之类的东西。并发写作将成为数据完整性的噩梦。

基本上,您使用此模式对写入命令进行排队,以便按请求顺序完​​成。

您还应该使用ReaderWriterLock来确保在写入时可以从文件中读取。这将是命令模式背后的第二道防线,因此在给定时间只有一个线程可以写入文件。

答案 4 :(得分:0)

你也可以尝试锁定。这很容易 - “锁定确保一个线程不进入关键部分而另一个线程处于代码的关键部分。如果另一个线程试图输入锁定的代码,它将等待(阻塞)直到释放该对象。”< / p>

http://msdn.microsoft.com/en-us/library/c5kehkcz%28VS.71%29.aspx

答案 5 :(得分:0)

我还建议你寻找有多个读者的例子,在一个关键部分只有一位作者,这是一篇很好的解决方案的短文http://arxiv.org/PS_cache/cs/pdf/0303/0303005v1.pdf

或者,您可以查看每次请求时创建文件的副本,以及何时将任何更改写入与原始文件合并的文件。