CLR: .Net / Mono / Boo / Otros CLR > C#

 XML. Error al intentar grabar datos en el mismo momento

(1/2) > >>

Dieguinho..:
Hola! les hago una consulta...

Tengo una aplicación que tiene la configuración almacenada en un xml.
Como esta aplicación trabaja con threads cada tanto me pasa que tira error al momento de grabar algún dato en el xml. Supongo que es porque otro hilo ya lo está usando.
El error que me da es el siguiente:
'La operación solicitada no se puede realizar en un archivo con una sección asignada a usuario abierta.'

Que se les ocurre que puedo hacer para solucionarlo??

Saludos y gracias de antemano.

PD: el xml lo estoy grabando de la siguiente manera (es un ejemplo):

     
--- Código: ---XElement Datos = XElement.Load(sPathXML);
       
      var elemento = from item in Datos.Elements("Personas").Elements("Item")
                           where (string)item.Element("Id") == IdPersona
                           select item;

      elemento.ElementAt(0).SetElementValue("Edad", Valor);

      Datos.Save(sPathXML);
--- Fin del código ---

gabio2:
Ya intentaste cerrar tú objeto con un .Close();  ?

Ejemplo:

--- Código: C# ---XElement Datos = XElement.Load(sPathXML);              var elemento = from item in Datos.Elements("Personas").Elements("Item")                           where (string)item.Element("Id") == IdPersona                           select item;       elemento.ElementAt(0).SetElementValue("Edad", Valor);       Datos.Save(sPathXML);      Datos.Close();} 

En caso de que no te funcione, otra cosa que se me ocurre rápidamente es que pongas un try catch al momento donde vas a guardar... y si te marca error le pongas un Sleep de 200 milisegundos y seguidamente vuelves a llamar al método dentro del catch. Ejemplo:


--- Código: C# ---int numeroIntentos = 0;private void ReadSaveXML(){numeroIntentos++;XElement Datos = XElement.Load(sPathXML);              var elemento = from item in Datos.Elements("Personas").Elements("Item")                           where (string)item.Element("Id") == IdPersona                           select item;       elemento.ElementAt(0).SetElementValue("Edad", Valor);      try      {      Datos.Save(sPathXML);      Datos.Close();      }      catch(Exception ex)      {         if(numeroIntentos>3)         {throw new Exception("Se ha superado el número máximo para guardar");}         else { Thread.Sleep(200);  ReadSaveXML();  }      }     numeroIntentos = 0;} Saludos.

Dieguinho..:
gabio, gracias por la respuesta!

Lo del .close() ya me había fijado, pero el elemento XElement con el que manipulo el xml lamentablemente no lo tiene.

je y sabés que justamente ayer hice algo parecido a lo que decís. Puse un while con un try catch dentro y no sale hasta que se grabe. Y la verdad que en la práctica ni se nota la demora.

No me pareció que era lo ideal..., pero bueno así funciona y además necesitaba seguir avanzando!!

Ojala después encuentre una forma un poco mas delicada de hacer eso.

gracias!!

gabio2:
Si no tiene Close() debería tener Dispose()  para destruir el objeto. Saludos.

Dieguinho..:
Tampoco tiene Dispose().
Por ahora sigue ganando la opción del try/catch

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa