File.ReadAllText线程安全吗?

具体来说,将使用TPL Task.Factory.StartNew一个线程:

 Task.Factory.StartNew(() => { File.ReadAllText(@"thisFile.txt"); }); 

引起任何问题等? 似乎没有在MSDN资源上提及线程安全性

它位于SOAP Web服务环境中。

Ps请,我不想知道在Web环境中使用Task的专业和缺点。 我完全清楚这些问题, 理所当然地认为在我的情况下这个模型是合理的,谢谢。

没关系 – 假设没有任何内容同时写入文件,在这种情况下,您可能无法打开文件(或者可能看不到部分写入)。

根据文件的File

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

(不是说可以有任何实例方法,因为它是一个静态类……)

是的,这本身就是线程安全的; 但是,它仍然遵循文件系统的通常规则:对同一文件的并发访问取决于竞争句柄使用的是哪些标志。 如果任何句柄标记为独占访问,则它将因IO相关exception而失败。

实际上没有“线程安全”这样的东西,没有定义使用什么操作。

如果所有线程(和进程!)只是以任何一种方式读取文件,那么读取是安全的。 但是,如果某些线程(或其他进程)正在写入文件,您可能会获得一些最新信息,您永远不会知道如何组织写入。

要获得更多防故障访问,您可以使用

 using (var s = new FileStream(..., FileMode.Open, FileAccess.Read, FileShare.None)) using (var tr = new StreamReader(s)) { content = tr.ReadToEnd(); } 

File.ReadAllText的文档没有说明任何内容,因此不保证锁定的任何内容。

这是一种类似于弗拉德提出的方式。 我正在使用Read的FileShare选项,因此其他流可以从同一个文件中读取。

 byte[] buffer; using (FileStream fs = new FileStream("pathGoesHere", FileMode.Open, FileAccess.Read, FileShare.Read)) { buffer = new byte[fs.Length]; fs.Read(buffer, 0, (int)fs.Length); }