0

以下のテキストファイルにログインしています。Log()は、サードパーティのDLLによってトリガーされるコード内のイベント内から呼び出されています。サードパーティのDLLは複数のスレッドを作成するため、各スレッド内でイベントをトリガーできます。

私の質問は、以下のログを実行するためにコード内でイベントがトリガーされると、2つのイベントが同時にログファイルに書き込もうとしていて、ロックまたはイベントが一度に1つずつ発生するという問題が発生する可能性がありますか?

private void Log(string message)
{
        if(!Directory.Exists(AssemblyDirectory + @"\Logs"))
            Directory.CreateDirectory(AssemblyDirectory + @"\Logs");

        using (StreamWriter sw = new StreamWriter(AssemblyDirectory + @"\Logs\" + DateTime.Today.ToString("yyyyMMdd") + ".log", true))
        {
            sw.AutoFlush = true;
            sw.Write(message);
        }
}
4

3 に答える 3

1

はい、これにより同時実行性の問題が発生する可能性があります。よくわかりませんが、StreamWriter を 1 つ開いたままにしておくと (メソッドで「ロック」ステートメントを使用することをお勧めします)、問題が解決する可能性があります。それ以外の場合は、log4net のようなものを見てください。複数のスレッドからファイルにログを記録するためのソリューションがあります。

于 2012-10-03T09:24:52.197 に答える
0

それは起こり得る。ログ ファイルを使用するには、FileStream クラスを使用します。ファイルを開くことで、ファイルへのアクセスを取得しようとします。

FileStream クラスが例外を発生させ、ファイルが使用されている場合

System.IO.FileStream fl = new FileStream("path", FileMode.Open);
fl.Write(byte[],int,int);
fl.dispose;
于 2012-10-03T09:26:32.110 に答える
0

はい、これは問題を引き起こす可能性があります。Zidad log4net は複数のスレッドを処理できるため、一方、作成したロガーを保持したい場合は、スレッドの一意の idを利用することをお勧めします:

using (StreamWriter sw = new StreamWriter(AssemblyDirectory + @"\Logs\" +
      DateTime.Today.ToString("yyyyMMdd") + 
      (new System.Diagnostics.TraceEventCache()).ThreadId +".log", true))
{
    sw.AutoFlush = true;
    sw.Write(message);
}

すべてのスレッドが終了したら、他のスレッドから 1 つのファイルを作成できます。

于 2012-10-03T09:36:46.197 に答える