DataSet.WriteXml(XmlTextWriter) оставляет файл XML заблокированным

У меня есть программа, написанная на.NET 3.5, которая сохраняет данные в файл XML, и большую часть времени после этого оставит ее в покое. Однако иногда ему нужно прочитать этот XML-файл обратно. Когда я пытаюсь это сделать, XML-файл не удается прочитать с ошибкой, что файл "используется другим процессом".

Вот код, который выполняет запись в XML-файл:

DataSet ds = new DataSet();
ds.Tables.Add(populatedDataTable);

XmlTextWriter xmlWrite = new XmlTextWriter("C:\test\output.xml", Encoding.UTF8);
ds.WriteXml(xmlWrite);
xmlWrite.Close();

А вот код, который пытается прочитать XML-файл обратно:

TextReader tr = new StreamReader("C:\test\output.xml");
DataSet dsXmlData = new DataSet();
dsXmlData.ReadXml(tr);

Поскольку метод XmlTextWriter.Close() запускается в первом блоке, почему этот файл все еще используется? Я попытался вызвать метод Dispose() для DataSet в первом блоке, но это не помогло. Чего здесь не хватает?

Я также протестировал запуск программы в режиме отладки, а затем немного подождал после запуска первого блока кода, прежде чем продолжить. Он по-прежнему выдавал ту же ошибку, это не проблема кода, работающего так близко друг к другу, что запись файла не полностью освобождается до попытки чтения.

Спасибо!

1 ответ

Решение

Мне удалось решить эту проблему, изменив логику использования операторов вместо создания XmlTextWriter, а затем закрыв ее вручную.

Вот старый код:

XmlTextWriter xmlWrite = new XmlTextWriter("C:\test\output.xml", Encoding.UTF8);
ds.WriteXml(xmlWrite);
xmlWrite.Close();

Вот новый код, который больше не имеет проблемы:

using(XmlTextWriter xmlWrite = new XmlTextWriter("C:\test\output.xml", Encoding.UTF8))
    ds.WriteXml(xmlWrite);

Для любого любопытного, у меня нет ответа относительно того, почему использование оператора решает проблему, но я счастлив, что решил это.

Другие вопросы по тегам