【问题标题】:How to implement synchronisization when log write by 100 applications at a time in c#如何在c#中一次100个应用程序写入日志时实现同步
【发布时间】:2012-10-15 06:00:49
【问题描述】:
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 期间我必须锁定哪个对象

【问题讨论】:

  • 这 100 个应用程序是独立的进程吗?还是您的意思是同一进程中的事物(线程/回调/任务/其他)?
  • 100 个不同的进程,你的意思是?如果是这样,lock 不会帮助你,因为那只是在一个进程中。如果您有 100 个不同的进程,为什么不让每个进程写入自己的文件?请注意,这种日志记录(添加单个条目涉及读取到目前为止记录的所有内容)效率非常低。
  • ya 表示 100 种不同的应用程序,可以是 Windows 服务、Web 应用程序、Windows 窗体、Web 服务等
  • @lax winform(传统上是桌面应用程序)和 web-app/web-service(传统上是服务器应用程序)共存会很奇怪......
  • 以上函数在 Logwriter 类中,所以我可以在我的所有应用程序中实现这个类...

标签: c# .net multithreading synchronization locking


【解决方案1】:

听起来你在谈论一个命名的互斥锁;您可以使用Mutex 名称为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();
}

【讨论】:

  • 我如何使用互斥锁实现我的方法
  • @lax 就像上面的例子一样......只需将需要同步访问的代码替换为“在这里做一些工作”。
  • Marc 表示我在那里写了整个 writeXml 函数
  • @lax 我很困惑问题是什么......不确定“fisible”是指“可修复”还是“可行”,但是:没有什么可修复的,而且完全可行
  • fisible 表示写日志时稳定无异常...除了我的xml代码写函数
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-09-20
    • 2012-12-30
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多