2

asp.netマルチスレッド環境スレッドセーフ内のテキストファイルを読み込んでいますか?

以下のようなテキストファイルを読むことを意味します

File.ReadAllLines(
HttpContext.Current.Server.MapPath(@"textFiles\generic_anchors.txt")
).ToArray();

asp.net 4.5

上記の読み取りで例外が発生する可能性はありますか?

4

3 に答える 3

4

はいといいえ。

ファイルにコードを書き込んでいる場合は、ファイルへのすべてのアクセスを同期する必要があります。

ただし、ファイルを読み取るだけで、サイトの実行中に変更されない場合は問題ありません。複数のスレッドが同じファイルを同時に読み取ることができます。

補足:ToArray最後の呼び出しは無駄です。メソッドはすでに配列を返しています。

于 2013-06-10T12:30:48.333 に答える
0

あなたは2つの異なる質問をしています。

スレッド セーフは、同じメソッドが複数のスレッドを介して同時に呼び出された場合の競合状態 (破損、一貫性のない結果、デッドロックなど) を排除することに関係しています。.NET BCL では、スレッド セーフでないstaticメソッドは考えられません。ただし、これは魔法のようなものではありません。独自のメソッドを作成する場合は、スレッド セーフであることを確認する必要があります。static

したがって、最初の質問 (「File.ReadAllLines はスレッド セーフですか?」というタイトルから) に対する答えは「はい」です。File.ReadAllLinesは BCL の静的メソッドであるため、スレッド セーフです。

ただし、 2 番目の質問は、「上記の読み取りで例外が発生する可能性はありますか?」です。これはスレッドセーフとはほとんど関係ありません。スレッド セーフなメソッドは、その正確性を犠牲にすることなく例外をスローできます。MSDN が示すようにFile.ReadAllLines、考えられる例外のリストは次のとおりです。

  • ArgumentException
  • ArgumentNullException
  • PathTooLongException
  • DirectoryNotFoundException
  • IO例外
  • UnauthorizedAccessException
  • FileNotFoundException
  • サポートされていない例外
  • セキュリティ例外

これらの例外はどれもスレッド セーフとは関係がなく、実際には、非スレッド セーフ FileStreamクラスについて文書化されているのと同じ例外セットです。

于 2013-06-10T13:24:41.870 に答える