У меня есть служба, которая обрабатывает данные и экспортирует XML-файлы для другой службы, которая обычно обрабатывает небольшой объем данных (около 5 файлов в минуту), но иногда сбрасывается большой кусок данных, и он может обрабатывать необходимость создания 100 файлов одновременно.
Служба работает в основном нормально, но иногда встречается ошибка:
The process cannot access the file 'C:\File.xml' because it is being used by another process.
Это странно, потому что файл должен создаваться, записываться и закрываться за один раз, поэтому я не знаю, что может вызвать эту проблему. Кажется, что проблема возникает чаще при большой нагрузке, но все же регулярно возникает и при небольших нагрузках. Естественно, это никогда не появляется во время отладки, или я, вероятно, исправил бы это сейчас.
Вот функция, которая фактически записывает файл:
public bool WriteDocument(Object Data)
{
XmlDocument X = new XmlDocument();
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, "Schema.xsd");
X.Schemas = schemaSet;
if (!Directory.Exists("OutputDirectory"))
{
Directory.CreateDirectory("OutputDirectory");
}
string File = Path.Combine("OutputDirectory", @"File" + ".xml");
XmlSerializer Encoder = new XmlSerializer(typeof(Object));
//Do stuff to data object to prepare for output
using (MemoryStream buffer = new MemoryStream())
{
Encoder.Serialize(buffer, Data);
buffer.Position = 0;
X.Load(buffer);
X.Validate((sender, e) =>
{
if (e.Severity == XmlSeverityType.Error)
{
result = false;
}
else
{
result = true;
}
});
}
if (result)
{
while (System.IO.File.Exists(File))
{
File = MakeUniqueName(File);
}
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
using (XmlWriter Writer = XmlWriter.Create(File, settings))
{
X.WriteTo(Writer);
Writer.Close();
}
}
return result;
}