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

名前付きミューテックスについて話しているようです。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();
}
于 2012-10-15T06:11:57.630 に答える
1

100個のアプリケーションから送信されたTCPパケットを介してログメッセージを受信できる別のWindowsサービスが必要であることをお勧めします。これにより、ファイルアクセスが効果的にシリアル化されます。

その場合、ロギングルーチンはlocalhost特定のポートにデータをPOSTする必要があります。

Windowsサービスは、バッファリングしてから、独自の時間にログエントリをファイルに書き込みます。

于 2012-10-15T07:15:30.753 に答える