在 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
电话只是浪费。该方法已经返回一个数组。
你问的是两个不同的问题。
当通过多个线程同时调用相同的方法时,线程安全涉及消除竞争条件(损坏、不一致的结果、死锁等)。在.NET BCL 中,我想不出任何不是线程安全的static
方法。然而,这并不神奇——如果你要创建自己的方法,你需要确保它是线程安全的。static
因此,您的第一个问题的答案(来自标题“File.ReadAllLines 线程安全吗?”)是肯定的。由于File.ReadAllLines
是 BCL 中的静态方法,因此它是线程安全的。
但是,您的第二个问题是“上述阅读会导致任何异常吗?”。这与线程安全无关。线程安全的方法可以在不牺牲其正确性的情况下抛出异常。正如MSDN 所示File.ReadAllLines
,可能的例外列表是:
这些异常都与线程安全无关,实际上是为非线程安全 FileStream
类记录的同一组异常。
来自 MSDN 上的File 类
此类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。
当然异常问题是另一个游戏。如果某些其他进程在您尝试读取的文件上获得排他锁,则保证会发生异常