SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: Dieguinho.. en Miércoles 22 de Enero de 2014, 00:27

Título: XML. Error al intentar grabar datos en el mismo momento
Publicado por: Dieguinho.. en Miércoles 22 de Enero de 2014, 00:27
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: [Seleccionar]
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);
Título: Re:XML. Error al intentar grabar datos en el mismo momento
Publicado por: gabio2 en Miércoles 22 de Enero de 2014, 20:48
Ya intentaste cerrar tú objeto con un .Close();  ?

Ejemplo:
Código: C#
  1. XElement Datos = XElement.Load(sPathXML);
  2.        
  3.       var elemento = from item in Datos.Elements("Personas").Elements("Item")
  4.                            where (string)item.Element("Id") == IdPersona
  5.                            select item;
  6.  
  7.       elemento.ElementAt(0).SetElementValue("Edad", Valor);
  8.  
  9.       Datos.Save(sPathXML);
  10.       Datos.Close();
  11. }
  12.  


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#
  1. int numeroIntentos = 0;
  2. private void ReadSaveXML()
  3. {
  4. numeroIntentos++;
  5. XElement Datos = XElement.Load(sPathXML);
  6.        
  7.       var elemento = from item in Datos.Elements("Personas").Elements("Item")
  8.                            where (string)item.Element("Id") == IdPersona
  9.                            select item;
  10.  
  11.       elemento.ElementAt(0).SetElementValue("Edad", Valor);
  12.       try
  13.       {
  14.       Datos.Save(sPathXML);
  15.       Datos.Close();
  16.       }
  17.       catch(Exception ex)
  18.       {
  19.          if(numeroIntentos>3)
  20.          {throw new Exception("Se ha superado el número máximo para guardar");}
  21.          else { Thread.Sleep(200);  ReadSaveXML();  }
  22.       }
  23.      numeroIntentos = 0;
  24. }
  25.  
Saludos.
Título: Re:XML. Error al intentar grabar datos en el mismo momento
Publicado por: Dieguinho.. en Jueves 23 de Enero de 2014, 13:32
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!!
Título: Re:XML. Error al intentar grabar datos en el mismo momento
Publicado por: gabio2 en Jueves 23 de Enero de 2014, 21:25
Si no tiene Close() debería tener Dispose()  para destruir el objeto. Saludos.
Título: Re:XML. Error al intentar grabar datos en el mismo momento
Publicado por: Dieguinho.. en Viernes 24 de Enero de 2014, 19:29
Tampoco tiene Dispose().
Por ahora sigue ganando la opción del try/catch
Título: Re:XML. Error al intentar grabar datos en el mismo momento
Publicado por: gabio2 en Sábado 25 de Enero de 2014, 19:13
Checa este link

http://msdn.microsoft.com/es-es/library/system.xml.linq.xelement(v=vs.110).aspx

Probablemente te pueda servir el Finalize()


Título: Re:XML. Error al intentar grabar datos en el mismo momento
Publicado por: Dieguinho.. en Lunes 27 de Enero de 2014, 20:42
Es raro, si bien lo dice en el artículo que me pasaste, mi objeto XElement no tiene tampoco el .Finalize()...
Es mas, mirando a ojo, parece que tiene casi todos los demás métodos menos ese.

Gracias igual!!