多个线程从同一个文件读取

我有一个需要多次读取的xml文件。 我正在尝试使用Parallel.ForEach来加速这个过程,因为没有读入的数据与它被读入的顺序有关。数据只是用于填充对象。 我的问题是即使我每次在线程中打开文件只读它抱怨它是由另一个程序打开。 (我没有在文本编辑器中打开它或任何东西:))

如何从同一个文件中完成多次读取?

编辑:文件大约是18KB。 它读取大约1800次。

谢谢

如果要从同一文件中读取多个线程,则需要指定FileShare.Read

 using (var stream = File.Open("theFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read)) { ... } 

但是,由于多种原因,您无法实现任何加速:

  1. 你的硬盘一次只能读一件事。 虽然您有多个线程同时运行,但这些线程最终都会等待彼此。
  2. 您无法轻松解析XML文件的一部分。 您通常每次都必须解析整个XML文件。 由于您有多个线程一直在读取它,因此您似乎不希望文件发生更改。 如果是这种情况,那你为什么需要多次阅读呢?

根据文件的大小和您正在执行的读取类型,首先将文件加载到内存中,然后直接向线程提供访问权限可能会更快。

你没有提供关于文件,读取等的任何细节,所以我不能确定它是否能满足你的特定需求。

一般的前提是在单个线程中加载文件一次,然后直接(通过Xml结构)或间接(通过XmlNodes等)提供对每个线程的文件的访问。 我想象类似于:

  1. 加载文件
  2. 对于每个Xpath查询,将匹配节点分派给您的线程。

如果线程不直接修改XML,这可能是一个可行的替代方案。

打开文件时,需要指定FileShare.Read

 using (var stream = new FileStream("theFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read)) { ... } 

这样可以多次打开文件进行读取