1
public class Logwriter {
    public Void WriteXml()
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(@"C:\Log_Data.xml");

        XmlElement newelement = xmlDoc.CreateElement("entry");
        XmlElement xmldata = xmlDoc.CreateElement("data");
                    XmlElement xmlcontent = xmlDoc.CreateElement("content");

                    xmldata.InnerText ="1234" ;
        xmlcontent.InnerText ="Stackoverflow";

                    newelement.AppendChild(xmldata);
        newelement.AppendChild(xmlcontent);

                    xmlDoc.DocumentElement.AppendChild(newelement);
        xmlDoc.Save(@"C:\Log_Data.xml");
}}

上面的 WriteXml() 函数一次可以被 100 个应用程序调用,所以我必须防止 IOException 错误。我可以使用锁来避免这些异常,所以我该怎么做。请解释在编写 xml 期间我必须锁定哪个对象

4

2 回答 2

3

听起来您在谈论一个命名的互斥锁;您可以将 aMutex与 类似的名称一起使用Global\MySharedLog,然后在同一台机器上的不同会话中的不同应用程序将可以看到该名称。这允许每个 exe 在一段时间内获取排他锁(以托管方式)。

然而!

  • 每个应用程序有一个单独的日志会更简单,更高效
  • xml 不是一种很好的日志格式,特别是如果您要每次都读取/写入整个内容以添加一行;在日志条目 #10 上听起来不错,在日志条目 #12,301,023 上不太好

例如:

Mutex m = new Mutex(false, @"Global\MySharedLog");
...

m.WaitOne();
try {
    // do some work here
} finally {
    m.ReleaseMutex();
}
于 2012-10-15T06:11:57.630 回答
1

我建议您需要一个单独的 Windows 服务,该服务可以通过从 100 个应用程序发送的 TCP 数据包接收日志消息。这将有效地序列化文件访问。

然后,您的日志记录例程必须将数据发布到localhost特定端口上。

Windows 服务将缓冲,然后在自己的时间将日志条目写入文件。

于 2012-10-15T07:15:30.753 回答