У меня есть файл xml, который нужно читать много раз. Я пытаюсь использовать Parallel.ForEach, чтобы ускорить этот процесс, поскольку ни один из этих считываемых данных не имеет отношения к тому, в каком порядке они читаются. Данные просто используются для заполнения объектов. Моя проблема в том, что даже если я открываю файл каждый раз в потоке, поскольку он только для чтения, он жалуется, что он открыт другой программой. (Я не открывал его в текстовом редакторе или еще где-нибудь :))
Как я могу выполнить несколько операций чтения из одного и того же файла?
РЕДАКТИРОВАТЬ: Размер файла ~ 18 КБ довольно мал. Его читают около 1800 раз.
Спасибо
Если вы хотите, чтобы несколько потоков читали один и тот же файл, вам нужно указать FileShare.Read
:
using (var stream = File.Open("theFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
...
}
Однако вы не добьетесь ускорения от этого по нескольким причинам:
В зависимости от размера файла и типа чтения, которое вы выполняете, может быть быстрее сначала загрузить файл в память, а затем предоставить доступ к нему напрямую вашим потокам.
Вы не предоставили никакой информации о файле, чтениях и т. Д., Поэтому я не могу сказать наверняка, будет ли это отвечать вашим конкретным потребностям.
Общая предпосылка заключается в том, чтобы загрузить файл один раз в одном потоке, а затем либо напрямую (через структуру Xml), либо косвенно (через XmlNodes и т. Д.) Предоставить доступ к файлу каждому из ваших потоков. Я представляю себе нечто подобное:
Если потоки не изменяют XML напрямую, это может быть жизнеспособной альтернативой.
При открытии файла необходимо указать FileShare.Read
:
using (var stream = new FileStream("theFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
...
}
Таким образом, файл можно будет открывать несколько раз для чтения