4

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

该文件有时会因为并发写入而损坏。

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

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

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

4

3 回答 3

4

你最好的选择就是使用锁/互斥锁。这是一种简单的方法,它有效,您可以轻松理解它并对其进行推理。

在同步方面,通常从可行的最简单解决方案开始,并且只有在遇到问题时才尝试改进。

于 2011-02-18T18:47:06.663 回答
2

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

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

在从多个线程记录的程序中,我创建了一个TextWriter本质上是队列的后代。线程调用该对象的WriteorWriteLine方法,该方法格式化输出并将其放入队列中(使用 a BlockingCollection)。一个单独的日志线程服务于队列——从中拉出东西并将它们写入日志文件。这有几个好处:

  • 线程不必为了记录而相互等待
  • 只有一个线程正在写入文件
  • 轮换日志很简单(即每小时启动一个新的日志文件等)
  • 出错的可能性为零,因为我忘记在某个线程上进行锁定

跨流程执行此操作会困难得多。我什至从未考虑过尝试跨进程共享日志文件。如果我需要它,我会创建一个单独的应用程序(一个日志服务)。该应用程序将执行实际的写入操作,而其他应用程序则传递要写入的字符串。同样,这确保了我不会搞砸,并且我的代码保持简单(即客户端中没有明确的锁定代码)。

于 2011-02-18T19:43:32.400 回答
1

您可能可以使用设置为File.Open()FileShareNone,并让每个线程在无法访问文件时等待。

于 2011-02-18T18:41:21.850 回答