C# 在c语言中一次写入100个应用程序的日志时如何实现同步

C# 在c语言中一次写入100个应用程序的日志时如何实现同步,c#,.net,multithreading,synchronization,locking,C#,.net,Multithreading,Synchronization,Locking,上面的WriteXml函数一次可以被100个应用程序调用,所以我必须防止IOException错误。 我可以使用lock避免这些异常,所以我如何才能做到这一点。 请解释我在编写xml时必须锁定哪个对象听起来像是在谈论一个命名的互斥体;您可以使用名为Global\MySharedLog的互斥锁,这样同一台机器上不同会话中的不同应用程序都可以看到该互斥锁。这允许每个exe在一段时间内以托管方式获取独占锁 然而 每个应用程序有一个单独的日志会简单得多,效率也更高 xml不是一种很好的日志格式,尤其是当

上面的WriteXml函数一次可以被100个应用程序调用,所以我必须防止IOException错误。 我可以使用lock避免这些异常,所以我如何才能做到这一点。
请解释我在编写xml时必须锁定哪个对象听起来像是在谈论一个命名的互斥体;您可以使用名为Global\MySharedLog的互斥锁,这样同一台机器上不同会话中的不同应用程序都可以看到该互斥锁。这允许每个exe在一段时间内以托管方式获取独占锁

然而

每个应用程序有一个单独的日志会简单得多,效率也更高 xml不是一种很好的日志格式,尤其是当您每次都要读/写整个内容以添加一行时;在日志条目10上听起来不错,但在日志条目12301023上就不那么好了 例如:

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");
}}

听起来你在谈论一个命名的互斥体;您可以使用名为Global\MySharedLog的互斥锁,这样同一台机器上不同会话中的不同应用程序都可以看到该互斥锁。这允许每个exe在一段时间内以托管方式获取独占锁

然而

每个应用程序有一个单独的日志会简单得多,效率也更高 xml不是一种很好的日志格式,尤其是当您每次都要读/写整个内容以添加一行时;在日志条目10上听起来不错,但在日志条目12301023上就不那么好了 例如:

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");
}}

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

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


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

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

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



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

这100个应用程序是独立的进程吗?或者你指的是同一进程中的线程/回调/任务/任何东西吗?你指的是100个不同的进程吗?如果是这样的话,lock将不会对您有所帮助,因为这只是在单个进程中实现的。如果您有100个不同的进程,为什么不让每个进程写入自己的文件?请注意,这种添加单个条目的日志记录涉及读取到目前为止记录的所有内容的记录方式非常低效。ya表示100种不同的应用程序,可以是windows服务、web应用程序、windows窗体、,网络服务etc@laxwinform(传统上是桌面应用程序)和web应用程序/web服务(传统上是服务器应用程序)共存是非常奇怪的…上面的函数在Logwriter类中,所以我可以在我的所有应用程序中实现这个类…这100个应用程序是独立的进程吗?或者你指的是同一进程中的线程/回调/任务/任何东西吗?你指的是100个不同的进程吗?如果是这样的话,lock将不会对您有所帮助,因为这只是在单个进程中实现的。如果您有100个不同的进程,为什么不让每个进程写入自己的文件?请注意,这种添加单个条目的日志记录涉及读取到目前为止记录的所有内容的记录方式非常低效。ya表示100种不同的应用程序,可以是windows服务、web应用程序、windows窗体、,网络服务etc@laxwinform(传统上是桌面应用程序)和web应用程序/web服务(传统上是服务器应用程序)共存是非常奇怪的…上面的函数在类Logwriter类中,因此我可以在我的所有应用程序中实现该类…我如何使用mutex@lax就像上面的例子一样。。。只需将需要同步访问的代码替换为“在这里做一些工作”。Marc意味着我已经编写了整个writeXml函数there@lax我不知道问题是什么。。。。不确定fisible是否意味着可修复或可行,但是:没有什么需要修复的,而且完全可行fisible意味着稳定在日志编写期间没有异常…除了我的xml代码编写函数我如何使用mutex@lax就像上面的例子一样。。。只需将需要同步访问的代码替换为“在这里做一些工作”。Marc意味着我已经编写了整个writeXml函数there@lax我不知道问题是什么。。。。不确定fisible是否意味着可修复或可行,但是:没有什么需要修复的,它是完全可行的fisible意味着稳定在日志编写过程中没有异常…除了我的xml代码编写函数