在asp.net多线程环境中读取文本文件线程安全吗?
我的意思是像下面这样阅读文本文件
File.ReadAllLines(
HttpContext.Current.Server.MapPath(@"textFiles\generic_anchors.txt")
).ToArray();asp.net 4.5
上面的阅读会导致任何异常吗?
发布于 2013-06-10 20:30:48
是,也不是。
如果有一些代码写入该文件,则需要同步所有对该文件的访问。
但是,如果您只读取文件,并且在站点运行时该文件从未更改,那么这不是问题。多个线程可以同时读取同一文件。
附注:末尾的ToArray调用只是一种浪费。该方法已返回一个数组。
发布于 2013-06-10 20:29:41
从File class上的MSDN
此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不能保证任何实例成员都是线程安全的。
当然,异常问题是另一种游戏。如果某个其他进程获得您正在尝试读取的文件的独占锁,则肯定会发生异常
发布于 2013-06-10 21:24:42
你在问两个不同的问题。
线程安全与消除竞争条件(损坏、不一致的结果、死锁等)有关。当通过多个线程同时调用相同的方法时。在.NET BCL中,我想不出任何不是线程安全的static方法。然而,这并不神奇--如果你要创建自己的static方法,你需要确保它的线程安全性。
因此,您的第一个问题(来自标题“File.ReadAllLines线程安全吗?”)的答案是肯定的。因为File.ReadAllLines是BCL中的静态方法,所以它是线程安全的。
然而,您的第二个问题是“以上阅读是否会导致任何例外?”这与线程安全没有多大关系。线程安全的方法可以在不牺牲正确性的情况下抛出异常。作为MSDN shows for File.ReadAllLines,可能的异常列表如下:
所有这些异常都与线程安全没有任何关系,实际上是为非线程安全的FileStream class记录的同一组异常。
https://stackoverflow.com/questions/17023816
复制相似问题