具体来说,将使用TPL Task.Factory.StartNew
:
Task.Factory.StartNew(() => {
File.ReadAllText(@"thisFile.txt");
});
导致任何问题等?在MSDN resource
上似乎没有提及线程安全性它位于SOAP Web服务环境中。
请注意,我不想知道在网络环境中使用任务的专业和缺点。我完全了解这些问题,请,只是认为在我的情况下这个模型是合理的,谢谢。
答案 0 :(得分:12)
没关系 - 假设没有任何内容同时写入文件,在这种情况下,您可能无法打开文件(或者可能看不到部分写入)。
此类型的任何公共静态(在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);
}