XmlTextWriter. Процесс не может получить доступ к файлу так как этот файл используется другим процессом
У меня есть 3 XML файла,из которых нужно периодически считывать информацию и стоить treeview'ы исходя из нее. Я делаю это так - при необходимости что-то считать, запускаются 3 потока, каждый из которых пытается прочитать файл( if (XMLReady[index] == true) проверяет была ли уже записана информация в файл). В первый раз все работает отлично, но при повторном вызове получаю исключение System.IO.IOException: 'Процесс не может получить доступ к файлу "***", так как этот файл используется другим процессом.'. Почему так - не понимаю, ведь поток и сам XmlTextReader закрыты. Подскажите, как это можно исправить?
public void readXML(System.Windows.Forms.TreeView treeView, string fileName,int index)
{
while (true)
{
if (XMLReady[index] == true)
{
using (var reader = new XmlTextReader(fileName))
{
try
{
Dispatcher.Invoke(() => treeView.BeginUpdate());
TreeNode parentNode = null;
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == XmlNodeTag)
{
TreeNode newNode = new TreeNode();
bool isEmptyElement = reader.IsEmptyElement;
int attributeCount = reader.AttributeCount;
if (attributeCount > 0)
{
for (int i = 0; i < attributeCount; i++)
{
reader.MoveToAttribute(i);
SetAttributeValue(newNode, reader.Name, reader.Value);
}
}
if (parentNode != null)
Dispatcher.Invoke(() => parentNode.Nodes.Add(newNode));
else
Dispatcher.Invoke(() => treeView.Nodes.Add(newNode));
if (!isEmptyElement)
{
parentNode = newNode;
}
}
}
else if (reader.NodeType == XmlNodeType.EndElement)
{
if (reader.Name == XmlNodeTag)
{
parentNode = parentNode.Parent;
}
}
else if (reader.NodeType == XmlNodeType.XmlDeclaration)
{
}
else if (reader.NodeType == XmlNodeType.None)
{
return;
}
else if (reader.NodeType == XmlNodeType.Text)
{
parentNode.Nodes.Add(reader.Value);
}
}
}
finally
{
Visit(treeView.Nodes);
Dispatcher.Invoke(() => treeView.EndUpdate());
reader.Dispose();
reader.Close();
Thread.CurrentThread.Abort();
}
}
}
Thread.Sleep(100);
}
}
Вызов потоков
new Thread(() => readXML(tvMission, "./Knowledge//MyTreeView.xml", 0)).Start();
new Thread(() => readXML(tvRestruction, "./Knowledge//MyTreeView1.xml", 1)).Start();
new Thread(() => readXML(tvAttr, "./Knowledge//MyTreeView2.xml", 2)).Start();