【发布时间】:2013-08-16 13:09:05
【问题描述】:
我有几个客户端对象(TCPClient 包装器)在不同的线程上运行。如果这些对象中的任何一个遇到问题,则会将错误消息保存到 XML 错误日志中。显然,文件访问一次仅限于一个进程,所以我需要一种方法来防止其他线程在另一个线程使用它时读取/写入。
我目前正在使用lock 方法,但是仍然抛出异常,表明另一个进程正在使用该文件。我的印象是lock 将管理等待和重试。
// Lock the XML IO for safety due to multi-threading
lock (this.xmlDoc) // Changed from this to the xmlDoc
{
// Attempt to load existing xml
try
{
this.xmlDoc.Load(this.logPath);
}
catch (FileNotFoundException e)
{
// xml file doesn't exist, create
this.xmlDoc.AppendChild(this.xmlDoc.CreateElement("root"));
}
// Get the doc root
XmlElement root = this.xmlDoc.DocumentElement;
// Create message entry
XmlElement msg = this.xmlDoc.CreateElement("message");
// Add <time></time> to msg
msg.AppendChild(this.xmlDoc.CreateElement("time")).InnerText = dt.ToString();
// Add <error></error> to msg
msg.AppendChild(this.xmlDoc.CreateElement("error")).InnerText = message;
// Add msg to root
root.AppendChild(msg);
// Save. Done.
this.xmlDoc.Save(this.logPath);
}
【问题讨论】:
-
我最初锁定了这个 - 我理解为什么这是不好的做法 - 但是在专门锁定 XmlDocument 时我得到了相同的结果。 @SLaks 下次发表建设性意见。
-
@Lee:像 log4net 这样的实际日志框架解决了这个问题和许多其他问题,并且可能比手动锁定更有效。
-
@Slaks 我确定他们是,但我怀疑我的简单日志记录要求是否需要使用额外的框架,此外,开发人员不应该用框架来代替理解底层逻辑,我会这样做如果我不能确保我知道如何正确使用锁。
-
锁定只读对象而不是 xmlDoc。
标签: c# .net xml multithreading locking