我有一个需要被多次读取的xml文件,希望使用Parallel.ForEach来加速处理,因为所读取的数据与读取顺序无关,只是用于填充对象。我的问题是,即使在每个线程中以只读方式打开文件,它仍然抱怨文件已被其他程序打开。(我没有在文本编辑器或其他地方打开它:))
我该如何实现从同一文件进行多次读取?
编辑:文件大小约为18KB,非常小。需要从中读取大约1800次。
谢谢
我有一个需要被多次读取的xml文件,希望使用Parallel.ForEach来加速处理,因为所读取的数据与读取顺序无关,只是用于填充对象。我的问题是,即使在每个线程中以只读方式打开文件,它仍然抱怨文件已被其他程序打开。(我没有在文本编辑器或其他地方打开它:))
我该如何实现从同一文件进行多次读取?
编辑:文件大小约为18KB,非常小。需要从中读取大约1800次。
谢谢
如果你想让多个线程从同一个文件中读取,你需要指定 FileShare.Read
:
using (var stream = File.Open("theFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
...
}
然而,你不会因此获得任何加速,原因如下:
FileShare.Read
:using (var stream = new FileStream("theFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
...
}
虽然这是一篇旧文章,但似乎很受欢迎,所以我想添加一个解决方案,我已经成功地用于需要对文件进行读取访问的多线程环境。但是,文件必须足够小,以至于在处理期间至少可以保存在内存中,并且在共享访问期间只能读取文件而不能写入。
string FileName = "TextFile.txt";
string[] FileContents = File.ReadAllLines(FileName);
foreach (string strOneLine in FileContents)
{
// Do work on each line of the file here
}