Streamwriter锁不工作

Gre*_*reg 4 c# locking file streamwriter

我正在接管一个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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

_LogLock定义为类变量:

    private object _LogLock = 0;
Run Code Online (Sandbox Code Playgroud)

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

我所做的需要测试的更改是更多的日志使用.我们基本上添加了一个调试模式,以便为日志保存比用于保存更多的信息.

谢谢你的帮助!

编辑:

谢谢你的快速解答!VerifyOrCreateLogFile()的代码确实使用_LogLock,因此不应该是一个问题.它在错误输出之前会对日志进行一些写操作,因此它可以很好地创建文件.

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

再次感谢!

Ree*_*sey 7

锁应该阻止另一个线程尝试写入日志文件.

只有在使用此类的单个实例时才会出现这种情况.

如果每个(甚至一些)日志请求使用单独的实例,则锁定将不会保护您.

你可以通过制作_LogLock字段轻松"纠正"这个 static:

private static object _LogLock = 0;
Run Code Online (Sandbox Code Playgroud)

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