XMLWriter не может получить доступ к файлу, который он только что создал - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть служба, которая обрабатывает данные и экспортирует 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...