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

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

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

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

但是,您的第二个问题是“上述阅读会导致任何异常吗?”。这与线程安全无关。线程安全的方法可以在不牺牲其正确性的情况下抛出异常。正如MSDN 所示File.ReadAllLines,可能的例外列表是:

  • 参数异常
  • 参数NullException
  • 路径过长异常
  • DirectoryNotFoundException
  • IO异常
  • 未授权访问异常
  • FileNotFoundException
  • 不支持异常
  • 安全异常

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

于 2013-06-10T13:24:41.870 回答
0

来自 MSDN 上的File 类

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

当然异常问题是另一个游戏。如果某些其他进程在您尝试读取的文件上获得排他锁,则保证会发生异常

于 2013-06-10T12:29:40.877 回答