我正在接管一个 C# 项目,在测试它时出现错误。错误是无法写入日志文件,因为它正在被另一个进程使用。这是代码:

    public void WriteToLog(string msg)
    {
        if (!_LogExists)
        {
            this.VerifyOrCreateLogFile();  // Creates log file if it does not already exist.
        }

        // do the actual writing on its own thread so execution control can immediately return to the calling routine.
        Thread t = new Thread(new ParameterizedThreadStart(WriteToLog));
        t.Start((object)msg);
    }

    private void WriteToLog(object msg)
    {
        lock (_LogLock)
        {
            string message = msg as string;
            using (StreamWriter sw = File.AppendText(LogFile))
            {
                sw.Write(message);
                sw.Close();
            }
        }
    }

_LogLock 被定义为一个类变量:
    private object _LogLock = 0;

根据我的研究以及这几年在生产系统中一直运行良好的事实,我不知道可能是什么问题。该锁应防止另一个线程尝试写入日志文件。

我所做的需要测试的更改是更多的日志使用。我们基本上是添加一个 Debug模式来保存比以前更多的信息到日志中。

谢谢你的帮助!

编辑:

感谢您的快速回答! VerifyOrCreateLogFile() 的代码确实使用了 _LogLock,所以这应该不是问题。它确实在出错之前对日志进行了一些写入,因此它可以很好地创建文件。

问题似乎是以前只有一个类创建了日志类的实例,现在我已经向其他类添加了实例。这会产生问题是有道理的。将 _LogLock 字段更改为静态可修复该问题。

再次感谢!

最佳答案



仅当您使用此类的单个实例时,这才是正确的。

如果每个(甚至一些)日志请求使用单独的实例,那么锁将无法保护您。

您可以通过使 _LogLock 字段 static 轻松“纠正”这一点:

private static object _LogLock = 0;

这样,所有实例将共享相同的锁。

关于c# - Streamwriter 锁不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7419172/

10-11 22:40