asp.netマルチスレッド環境スレッドセーフ内のテキストファイルを読み込んでいますか?
以下のようなテキストファイルを読むことを意味します
File.ReadAllLines(
HttpContext.Current.Server.MapPath(@"textFiles\generic_anchors.txt")
).ToArray();
asp.net 4.5
上記の読み取りで例外が発生する可能性はありますか?
asp.netマルチスレッド環境スレッドセーフ内のテキストファイルを読み込んでいますか?
以下のようなテキストファイルを読むことを意味します
File.ReadAllLines(
HttpContext.Current.Server.MapPath(@"textFiles\generic_anchors.txt")
).ToArray();
asp.net 4.5
上記の読み取りで例外が発生する可能性はありますか?
はいといいえ。
ファイルにコードを書き込んでいる場合は、ファイルへのすべてのアクセスを同期する必要があります。
ただし、ファイルを読み取るだけで、サイトの実行中に変更されない場合は問題ありません。複数のスレッドが同じファイルを同時に読み取ることができます。
補足:ToArray
最後の呼び出しは無駄です。メソッドはすでに配列を返しています。
あなたは2つの異なる質問をしています。
スレッド セーフは、同じメソッドが複数のスレッドを介して同時に呼び出された場合の競合状態 (破損、一貫性のない結果、デッドロックなど) を排除することに関係しています。.NET BCL では、スレッド セーフでないstatic
メソッドは考えられません。ただし、これは魔法のようなものではありません。独自のメソッドを作成する場合は、スレッド セーフであることを確認する必要があります。static
したがって、最初の質問 (「File.ReadAllLines はスレッド セーフですか?」というタイトルから) に対する答えは「はい」です。File.ReadAllLines
は BCL の静的メソッドであるため、スレッド セーフです。
ただし、 2 番目の質問は、「上記の読み取りで例外が発生する可能性はありますか?」です。これはスレッドセーフとはほとんど関係ありません。スレッド セーフなメソッドは、その正確性を犠牲にすることなく例外をスローできます。MSDN が示すようにFile.ReadAllLines
、考えられる例外のリストは次のとおりです。
これらの例外はどれもスレッド セーフとは関係がなく、実際には、非スレッド セーフ FileStream
クラスについて文書化されているのと同じ例外セットです。