File.ReadAllText线程安全吗?

时间:2013-11-14 11:25:59

标签: c# web-services file-io task-parallel-library

具体来说,将使用TPL Task.Factory.StartNew

生成一个线程
Task.Factory.StartNew(() => {
       File.ReadAllText(@"thisFile.txt");
});

导致任何问题等?在MSDN resource

上似乎没有提及线程安全性

它位于SOAP Web服务环境中。

请注意,我不想知道在网络环境中使用任务的专业和缺点。我完全了解这些问题,,只是认为在我的情况下这个模型是合理的,谢谢。

4 个答案:

答案 0 :(得分:12)

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

根据documentation of File

  

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:1)

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

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

要获得更多防错访问权限,您可以使用

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

File.ReadAllText的{​​{3}}没有说明任何内容,因此不保证锁定的任何内容。

答案 3 :(得分:0)

这是一种类似于弗拉德提出的方法。我正在使用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);
}