在文件系统级别将写入同步到文件

时间:2011-02-18 18:35:50

标签: c# concurrency filesystems writing

我有一个文本文件,多个线程/进程会写入它(它是一个日志文件)。

由于并发写法,文件有时会被破坏。

我想使用所有线程的文件写入模式,这些线程在文件系统级别本身是顺序的。

我知道可以使用锁(多个进程的互斥锁)并同步写入此文件,但我更喜欢以正确的模式打开文件并将任务保留为System.IO

有可能吗?这种情况的最佳做法是什么?

3 个答案:

答案 0 :(得分:4)

您最好的选择就是使用锁/互斥锁。这是一个简单的方法,它可以工作,你可以很容易地理解它并推理它。

在同步方面,通常可以从最简单的解决方案开始,只有在遇到问题时才会优化。

答案 1 :(得分:2)

据我所知,Windows没有你想要的东西。没有文件句柄对象通过在写入文件时阻止所有其他用户来执行自动同步。

如果您的日志记录涉及三个步骤,打开文件,写入,关闭文件,那么您可以让线程尝试以独占模式(FileShare.None)打开文件,如果无法打开则捕获异常,并且然后再试一次,直到成功。我发现这充其量是乏味的。

在我从多个线程登录的程序中,我创建了一个基本上是队列的TextWriter后代。线程调用该对象上的WriteWriteLine方法,这些方法格式化输出并将其放入队列(使用BlockingCollection)。一个单独的日志记录线程服务该队列 - 从中​​提取内容并将其写入日志文件。这有一些好处:

  • 线程不必相互等待以便记录
  • 只有一个帖子正在写入文件
  • 旋转日志(即每小时启动一个新的日志文件等)是微不足道的。
  • 错误的可能性是因为我忘记在某些线程上执行锁定

跨流程执行此操作会更加困难。我甚至从未考虑尝试跨进程共享日志文件。如果我需要它,我会创建一个单独的应用程序(日志记录服务)。该应用程序将执行实际写入,其他应用程序传递要写入的字符串。再一次,这确保了我无法搞砸,我的代码仍然很简单(即客户端没有明确的锁定代码)。

答案 2 :(得分:1)

您可以使用File.Open()设置为None的{​​{3}},并在每个线程无法访问该文件时等待。

相关问题