4

StreamWriterクラス仕様から抜粋した以下の警告を参照してください。

「この型の public static (Visual Basic では共有) メンバーはスレッド セーフです。インスタンス メンバーは、スレッド セーフであるとは限りません。」

W3WC プロセスには、ワーカー スレッドと I/O スレッドの 2 つのスレッド プールが含まれていることを理解しています。ワーカー スレッドには、独自のスレッドを多数含めることができます (アプリケーションが独自のSystem.Threadインスタンスを作成する場合)。

警告はSystem.Threadsワーカー スレッドと I/O スレッドだけに関連するのか、それとも関連するのか、つまり、StreamWriterクラスのインスタンス変数がスレッド セーフではない場合、これは複数のワーカー スレッドがそれにアクセスすると問題が発生することを意味しますか? 2 つの異なる Web クライアント上の 2 人のユーザーが同時にログ ファイルに書き込もうとすると、一方が他方をロックアウトする可能性がありますか?

4

1 に答える 1

3

クラスがスレッドセーフでない場合、そのクラスのインスタンスを取得して、そのインスタンスを複数のスレッドから使​​用することはできません。それらがIIS 内のワーカー スレッドであるか、またはワーカー スレッドであるSystem.Threading.Threadかは問題ではありません。それらはすべてスレッドです。オブジェクトがプリエンプトされることを想定していない状態にある間、それらはすべてプリエンプティブ マルチタスクです。ThreadPoolTask

ただし、それはあなたが説明するシナリオでは問題ではありません。2 つの Web クライアントが同時にサーバーに接続しようとし、要求ハンドラーがファイルにログを記録しようとするとします。つまり、2 つのスレッドが同時にそのファイルに書き込もうとしている可能性があります。StreamWriterただし、両方のスレッドで同じインスタンスを使用することはないため、これはスレッド セーフの問題ではありません。(少なくとも、そうではないことを願っています。静的StreamWriterインスタンスがある場合、それをフラッシュしてファイルを閉じるタイミングをどのように知ることができますか? スレッド間で同じライターを共有しても意味がありません。)

代わりに、各スレッドは独自の を作成しStreamWriter、書き込みを行ってから閉じる必要があります。はい、まだ同時実行の問題があります。最初のスレッドがまだファイルを閉じていない場合、2 番目のスレッドがファイルを開こうとすると、2 番目のスレッドはファイル共有例外を取得し、その例外をキャッチする必要があります。再試行しますが、これはファイル ロックの問題であり、スレッド セーフの問題ではありません。

于 2013-10-26T15:50:58.823 に答える