9

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

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

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

它位于 SOAP Web 服务环境中。

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

4

4 回答 4

12

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

根据以下文档File

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

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

于 2013-11-14T11:28:01.657 回答
10

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

于 2013-11-14T11:27:52.297 回答
2

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

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

对于更防故障的访问,您可以使用

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

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

于 2013-11-14T11:38:32.360 回答
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);
}
于 2017-08-03T06:55:26.900 回答