• Domingo 17 de Noviembre de 2024, 15:34

Autor Tema:  XML. Error al intentar grabar datos en el mismo momento  (Leído 7151 veces)

Dieguinho..

  • Miembro activo
  • **
  • Mensajes: 43
    • Ver Perfil
XML. Error al intentar grabar datos en el mismo momento
« en: Miércoles 22 de Enero de 2014, 00:27 »
0
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);
« última modificación: Miércoles 22 de Enero de 2014, 00:40 por Dieguinho.. »

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re:XML. Error al intentar grabar datos en el mismo momento
« Respuesta #1 en: Miércoles 22 de Enero de 2014, 20:48 »
0
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.
« última modificación: Miércoles 22 de Enero de 2014, 21:00 por gabio2 »
@gabio87

Dieguinho..

  • Miembro activo
  • **
  • Mensajes: 43
    • Ver Perfil
Re:XML. Error al intentar grabar datos en el mismo momento
« Respuesta #2 en: Jueves 23 de Enero de 2014, 13:32 »
0
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

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re:XML. Error al intentar grabar datos en el mismo momento
« Respuesta #3 en: Jueves 23 de Enero de 2014, 21:25 »
0
Si no tiene Close() debería tener Dispose()  para destruir el objeto. Saludos.
@gabio87

Dieguinho..

  • Miembro activo
  • **
  • Mensajes: 43
    • Ver Perfil
Re:XML. Error al intentar grabar datos en el mismo momento
« Respuesta #4 en: Viernes 24 de Enero de 2014, 19:29 »
0
Tampoco tiene Dispose().
Por ahora sigue ganando la opción del try/catch

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re:XML. Error al intentar grabar datos en el mismo momento
« Respuesta #5 en: Sábado 25 de Enero de 2014, 19:13 »
0
Checa este link

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

Probablemente te pueda servir el Finalize()


@gabio87

Dieguinho..

  • Miembro activo
  • **
  • Mensajes: 43
    • Ver Perfil
Re:XML. Error al intentar grabar datos en el mismo momento
« Respuesta #6 en: Lunes 27 de Enero de 2014, 20:42 »
0
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!!