私の知る限り、Windowsにはあなたが探しているものがありません。ファイルへの書き込み中に他のすべてのユーザーをブロックすることによって自動同期を行うファイルハンドルオブジェクトはありません。
ロギングにファイルを開く、書き込む、ファイルを閉じるという3つのステップが含まれる場合は、スレッドでファイルを排他モード(FileShare.None
)で開こうとし、開くことができない場合は例外をキャッチして、成功するまで再試行することができます。私はそれがせいぜい退屈だと思った。
複数のスレッドからログを記録するプログラムで、TextWriter
基本的にキューである子孫を作成しました。スレッドはそのオブジェクトのWrite
orWriteLine
メソッドを呼び出します。これにより、出力がフォーマットされ、キューに入れられます(を使用してBlockingCollection
)。キューに入れる別のロギングスレッドサービス-そこから物を引き出してログファイルに書き込みます。これにはいくつかの利点があります。
- ログに記録するためにスレッドが互いに待機する必要はありません
- 1つのスレッドのみがファイルに書き込んでいます
- ログをローテーションするのは簡単です(つまり、1時間ごとに新しいログファイルを開始するなど)。
- 一部のスレッドでロックを行うのを忘れたため、エラーが発生する可能性はゼロです。
プロセス間でこれを行うことは、はるかに困難です。プロセス間でログファイルを共有しようと考えたことさえありません。それが必要な場合は、別のアプリケーション(ロギングサービス)を作成します。そのアプリケーションは実際の書き込みを行い、他のアプリケーションは書き込まれる文字列を渡します。繰り返しますが、それは私が物事を台無しにすることができないことを保証し、私のコードは単純なままです(つまり、クライアントに明示的なロックコードはありません)。