我有一个尝试写日志文件的记录器。问题似乎是当有多个进程访问同一个日志文件时,记录器无法写入日志文件,导致错误“另一个进程正在使用该文件...”,导致关键信息丢失。我尝试过使用锁,但它似乎不起作用,因为它们是独立的进程(我认为这就是它们不起作用的原因)。有没有办法让多个进程访问文件而不会丢失信息?如果没有,还有其他选择吗?感谢。
答案 0 :(得分:5)
您的选择没有特别的顺序:
答案 1 :(得分:2)
如Florian所述,Log4Net是一个选项。
另一种选择是使用单独的文件作为锁。如果存在锁定文件,则其他进程执行活动等待,否则它们会创建锁定文件,写入,然后删除锁定文件。
如果您未能创建锁定文件,则意味着在您等待之前,另一个进程已到达此处。
答案 2 :(得分:0)
如果您坚持重新发明轮子并且不使用其他选项(log4net或内存映射文件),则需要延迟写入文件本身,如果与另一个执行相同操作的线程发生冲突,请继续尝试。
使用任务来获取非阻塞函数的超简化版本并以示例的形式显示(不要按原样使用)。
public Task FlushLog(string filePath)
{
var task = new Task(
() =>
while (true)
{
try
{
var file = new FileStream(filePath, FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.Read));
WriteLogToFileInTheUsualWay(file);
file.Close();
file.Dispose();
break;
}
catch (UnauthorizedAccessException exception)
{
// Sleep randomly and try again
Thread.Sleep(new Random(DateTime.Now.Milliseconds).Next(1000));
}
}
);
task.Start();
return task;
}