File.ReadAllText 线程是否安全



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

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

导致任何问题等?MSDN 资源上似乎没有提到线程安全性

它位于 SOAP Web 服务环境中。

Ps 拜托,我不想知道在 Web 环境中使用任务的利弊。我完全了解这些问题,理所当然地认为,就我而言,这个模型是合理的,谢谢。

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

根据File的文件:

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

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

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

实际上,如果不定义使用什么操作,就没有"线程安全"这样的东西。

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

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

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

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

这是一种类似于弗拉德提议的方法。我正在使用"读取"的"文件共享"选项,因此其他流可以从同一文件读取。

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);
}

我回答这个答案已经晚了。我也想知道它是否线程安全。因此,我测试并发现如果所有读取都来自File.ReadAllText,则File.ReadAllText是线程安全的。 我使用以下代码进行了测试:

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace TestingFileReadAllText
{
    class Program
    {
        static int i=0;
        static void Main(string[] args)
        {
            for(int i =0;i<10000;i++)
            {
                Task.Run(ReadFile);
            }
            Thread.Sleep(20000);
            Console.WriteLine("Completed Successfully");
        }
        static void ReadFile()
        {
            int j = Interlocked.Increment(ref i);
            string s = File.ReadAllText(@"c:tempresutl.htm");
            Console.WriteLine($"Successfully {j} read: {s.Substring(0, 10)}");
        }
    }
}

最新更新