我有一个文本文件,多个线程/进程将写入它(它是一个日志文件)。
该文件有时会因为并发写入而损坏。
我想从所有线程中使用文件写入模式,该模式在文件系统级别本身是顺序的。
我知道可以使用锁(用于多个进程的互斥锁)并同步写入此文件,但我更喜欢以正确的模式打开文件并将任务留给System.IO
.
可能吗 ?这种情况的最佳做法是什么?
我有一个文本文件,多个线程/进程将写入它(它是一个日志文件)。
该文件有时会因为并发写入而损坏。
我想从所有线程中使用文件写入模式,该模式在文件系统级别本身是顺序的。
我知道可以使用锁(用于多个进程的互斥锁)并同步写入此文件,但我更喜欢以正确的模式打开文件并将任务留给System.IO
.
可能吗 ?这种情况的最佳做法是什么?
你最好的选择就是使用锁/互斥锁。这是一种简单的方法,它有效,您可以轻松理解它并对其进行推理。
在同步方面,通常从可行的最简单解决方案开始,并且只有在遇到问题时才尝试改进。
据我所知,Windows 没有您想要的。没有文件句柄对象通过在写入文件时阻止所有其他用户来自动同步。
如果您的日志记录涉及打开文件、写入、关闭文件三个步骤,那么您可以让您的线程尝试以独占模式(FileShare.None
)打开文件,如果无法打开则捕获异常,然后重试直到成功。我发现这充其量是乏味的。
在从多个线程记录的程序中,我创建了一个TextWriter
本质上是队列的后代。线程调用该对象的Write
orWriteLine
方法,该方法格式化输出并将其放入队列中(使用 a BlockingCollection
)。一个单独的日志线程服务于队列——从中拉出东西并将它们写入日志文件。这有几个好处:
跨流程执行此操作会困难得多。我什至从未考虑过尝试跨进程共享日志文件。如果我需要它,我会创建一个单独的应用程序(一个日志服务)。该应用程序将执行实际的写入操作,而其他应用程序则传递要写入的字符串。同样,这确保了我不会搞砸,并且我的代码保持简单(即客户端中没有明确的锁定代码)。
您可能可以使用设置为File.Open()
的FileShare
值None
,并让每个线程在无法访问文件时等待。