File.ReadAllLines线程安全吗?

时间:2013-06-10 12:24:32

标签: asp.net file-io thread-safety

读取asp.net多线程环境线程安全内的文本文件吗?

我的意思是阅读下面的文本文件

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

asp.net 4.5

以上读数会导致任何异常吗?

3 个答案:

答案 0 :(得分:4)

是的,没有。

如果有一些代码写入文件,则需要同步对文件的所有访问权。

但是,如果您只是在阅读文件并且在网站运行时它永远不会更改,那么这不是问题。多个线程可以同时读取同一个文件。

旁注:最后ToArray来电只是浪费。该方法已经返回一个数组。

答案 1 :(得分:0)

来自File class

上的MSDN
  

此类型的任何公共静态(在Visual Basic中为Shared)成员都是   线程安全。任何实例成员都不能保证是线程   安全

当然,例外问题是另一场比赛。如果某个其他进程在您尝试读取的文件上获得独占锁定,则保证发生异常

答案 2 :(得分:0)

你问的是两个不同的问题。

当通过多个线程同时调用相同的方法时,线程安全涉及消除竞争条件(损坏,不一致的结果,死锁等)。在.NET BCL中,我想不出不是线程安全的任何static方法。然而,这并不神奇 - 如果您要创建自己的static方法,则需要确保其线程安全。

那么,你的第一个问题(来自标题“File.ReadAllLines线程安全吗?”)的答案是肯定的。由于File.ReadAllLines是BCL中的静态方法,因此它是线程安全的。

然而,你的第二个问题是“上述读数会导致任何异常吗?”。这与线程安全无关。线程安全方法可以抛出异常而不会牺牲它的正确性。作为MSDN shows for File.ReadAllLines,可能的例外列表是:

  • 的ArgumentException
  • ArgumentNullException
  • PathTooLongException
  • DirectoryNotFoundException
  • IOException
  • UnauthorizedAccessException
  • FileNotFoundException
  • NotSupportedException
  • SecurityException

这些异常都与线程安全无关,实际上是为非线程安全 FileStream class记录的同一组异常。