具体来说,将使用 TPL 生成一个线程Task.Factory.StartNew
:
Task.Factory.StartNew(() => {
File.ReadAllText(@"thisFile.txt");
});
引起任何问题等?MSDN 资源上似乎没有提到线程安全
它位于 SOAP Web 服务环境中。
Ps 请,我不想知道在 Web 环境中使用任务的利弊。我完全了解这些问题,请理所当然地认为在我的情况下这个模型是合理的,谢谢。
具体来说,将使用 TPL 生成一个线程Task.Factory.StartNew
:
Task.Factory.StartNew(() => {
File.ReadAllText(@"thisFile.txt");
});
引起任何问题等?MSDN 资源上似乎没有提到线程安全
它位于 SOAP Web 服务环境中。
Ps 请,我不想知道在 Web 环境中使用任务的利弊。我完全了解这些问题,请理所当然地认为在我的情况下这个模型是合理的,谢谢。
很好 - 假设没有同时写入文件,在这种情况下,您可能无法打开文件(或可能会看到部分写入)。
根据以下文档File
:
此类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。
(并不是说可以有任何实例方法,因为它是一个静态类......)
是的,这本身就是线程安全的;但是,它仍然受制于文件系统的通常规则:对同一文件的并发访问取决于竞争句柄使用了哪些标志。如果任何句柄将其标记为独占访问,则它将失败并出现与 IO 相关的异常。
如果不定义使用什么操作,实际上就没有“线程安全”这样的东西。
如果所有线程(和进程!)都只是以任何一种方式读取文件,则读取是安全的。但是,如果某些线程(或其他进程)正在写入文件,您可能会得到一个半最新的信息,您永远不知道写入是如何组织的。
对于更防故障的访问,您可以使用
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);
}