Web Services File.ReadAllText线程安全吗?

xzabzqsa  于 2022-11-15  发布在  其他
关注(0)|答案(5)|浏览(167)

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

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

导致任何问题等?MSDN resource上似乎没有提到任何线程安全性
它位于SOAP Web服务环境中。
Ps请,我不想知道在网络环境中使用任务的利弊。我完全知道这些问题,* 请 *,只是理所当然地认为在我的情况下,这种模式是合理的,谢谢。

gpnt7bae

gpnt7bae1#

这是很好的-假设没有任何东西同时写入文件,在这种情况下,您可能无法打开文件(或者可能看到部分写入)。
根据documentation of File
此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。任何示例成员都不保证是线程安全的。
(Not可以有任何示例方法,因为它是一个静态类...)

3htmauhk

3htmauhk2#

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

ukdjmx9f

ukdjmx9f3#

如果不定义所使用的操作,实际上就没有“线程安全”这回事。
如果所有的线程(和进程)都只是以任意一种方式阅读文件,那么读取是安全的。然而,如果一些线程(或另一个进程)正在写入文件,你可能会得到一个半更新的信息,你永远不知道写入是如何组织的。
要获得更可靠的访问,您可以使用

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

File.ReadAllTextdocumentation没有声明任何内容,因此不保证任何有关锁定的内容。

ozxc1zmp

ozxc1zmp4#

这里有一个类似于Vlad建议的方法,我使用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);
}
zdwk9cvp

zdwk9cvp5#

这个问题我回答得有点晚了。我还想知道它是否是线程安全的。所以,我测试了一下,发现如果所有的读取都来自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:\temp\resutl.htm");
            Console.WriteLine($"Successfully {j} read: {s.Substring(0, 10)}");
        }
    }
}

相关问题