gpt4 book ai didi

c# - Streamwriter 锁不工作

转载 作者:太空狗 更新时间:2023-10-30 00:21:06 24 4
gpt4 key购买 nike

我正在接管一个 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 字段更改为静态可解决此问题。

再次感谢!

最佳答案

The lock should prevent another thread from attempting to write to the log file.

仅当您使用此类的单个实例时才适用。

如果每个(甚至某些)日志请求使用一个单独的实例,那么锁就不会保护你。

您可以通过将 _LogLock 字段设置为 static 轻松“纠正”此问题:

private static object _LogLock = 0;

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com