4

テキスト ファイルがあり、複数のスレッド/プロセスがそれに書き込みます (これはログ ファイルです)。

同時書き込みが原因で、ファイルが破損することがあります。

ファイルシステムレベル自体でシーケンシャルなすべてのスレッドからファイル書き込みモードを使用したいと考えています。

ロック (複数のプロセスのミューテックス) を使用してこのファイルへの書き込みを同期できることはわかっていますが、ファイルを正しいモードで開き、タスクをSystem.IO.

出来ますか ?このシナリオのベストプラクティスは何ですか?

4

3 に答える 3

4

あなたの最善の策は、ロック/ミューテックスを使用することです。これは単純なアプローチであり、機能し、簡単に理解して推論することができます。

同期に関しては、機能する可能性のある最も単純なソリューションから始めて、問題が発生した場合にのみ改良を試みるのが得策であることがよくあります。

于 2011-02-18T18:47:06.663 に答える
2

私の知る限り、Windowsにはあなたが探しているものがありません。ファイルへの書き込み中に他のすべてのユーザーをブロックすることによって自動同期を行うファイルハンドルオブジェクトはありません。

ロギングにファイルを開く、書き込む、ファイルを閉じるという3つのステップが含まれる場合は、スレッドでファイルを排他モード(FileShare.None)で開こうとし、開くことができない場合は例外をキャッチして、成功するまで再試行することができます。私はそれがせいぜい退屈だと思った。

複数のスレッドからログを記録するプログラムで、TextWriter基本的にキューである子孫を作成しました。スレッドはそのオブジェクトのWriteorWriteLineメソッドを呼び出します。これにより、出力がフォーマットされ、キューに入れられます(を使用してBlockingCollection)。キューに入れる別のロギングスレッドサービス-そこから物を引き出してログファイルに書き込みます。これにはいくつかの利点があります。

  • ログに記録するためにスレッドが互いに待機する必要はありません
  • 1つのスレッドのみがファイルに書き込んでいます
  • ログをローテーションするのは簡単です(つまり、1時間ごとに新しいログファイルを開始するなど)。
  • 一部のスレッドでロックを行うのを忘れたため、エラーが発生する可能性はゼロです。

プロセス間でこれを行うことは、はるかに困難です。プロセス間でログファイルを共有しようと考えたことさえありません。それが必要な場合は、別のアプリケーション(ロギングサービス)を作成します。そのアプリケーションは実際の書き込みを行い、他のアプリケーションは書き込まれる文字列を渡します。繰り返しますが、それは私が物事を台無しにすることができないことを保証し、私のコードは単純なままです(つまり、クライアントに明示的なロックコードはありません)。

于 2011-02-18T19:43:32.400 に答える
1

値を に設定して使用File.Open()し、ファイルにアクセスできない場合は各スレッドを待機させることができる場合があります。FileShareNone

于 2011-02-18T18:41:21.850 に答える