Pregunta

este biblioteca de código abierto que estoy teniendo algunos problemas para la fijación un problema ... Esta biblioteca permite crear fácilmente un archivo XML para almacenar parámetros de la aplicación. Pero estoy teniendo un problema de guardar los cambios.

Tengo otra aplicación en la que estoy usando esta biblioteca y cada vez que la ventana de la aplicación se realiza el cambio de tamaño, que llamo el método Save () de la biblioteca para guardar el tamaño de la ventana / posición en el fichero XML.

La mayoría de las veces funciona bien, todo se guarda. De vez en cuando, sin embargo, me sale una excepción diciendo que el archivo está siendo utilizado por otro proceso.

Es realmente necesario para asegurarse de que los cambios se guardan cada vez que el método Save () se llama, que necesito para manejar esta excepción alguna manera o evitar que suceda.

¿Qué están sugerencias para el mejor manejo de esta situación?

El código para el método Save () es la siguiente:

public void Save() {
    // Create a new XML file if there's no root element
    if(xDocument.DocumentElement == null) {
        xDocument = new XmlDocument();
        xDocument.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
            "<" + XmlRootElement + ">\n</" + XmlRootElement + ">");
    }

    // OMITTED CODE WAS HERE (NOT IMPORTANT FOR THE PROBLEM)

    // Create a new XML writer for the XML file
    XmlWriter xWriter = XmlWriter.Create(XmlFilePath, new XmlWriterSettings() {
        Indent = true,
        IndentChars = "\t"
    });

    // Sort the XML file using the XSL sylesheet and save it
    xslTransform.Transform(xDocument, xWriter);

    // Clear the buffer and close the XML writer stream
    xWriter.Flush();
    xWriter.Close();
}
¿Fue útil?

Solución

Podría darse el caso de que los eventos de cambio de tamaño de la ventana de-completado están disparando tan rápido, que la función de guardar está siendo llamado, el llamado nuevo antes de que finalice la ejecución de la primera vez. Esto daría como resultado el error que está describiendo (el otro proceso mediante el archivo es ... USTED!). Trate que rodea su código con una cerradura, thusly :

lock(some_shared_object)
{
    //Your code here
}

Otros consejos

XmlWriter es IDisposable. Usted debe envolver en una cláusula usando (). http://msdn.microsoft.com/en-us/ biblioteca / system.xml.xmlwriter.aspx

Tengo que ir con una combinación de las respuestas ya dadas aquí.

Su XmlWriter debe estar en un bloque usando por varias razones. Usted debe deshacerse de él para que sus recursos son liberados tan pronto como sea posible. Además, lo que si se arroja una excepción al interactuar con él. El archivo no se cierra correctamente, al menos hasta que el finalizador se activa y libera sus recursos.

A pesar de la instrucción using, que "podría" tener la contención en el archivo y la necesidad de colocar el código Guardar en un comunicado de bloqueo. El método no es reentrante, por naturaleza, ya que el archivo es un recurso compartido. Poner una cerradura en torno a que podría ser más de matar si no dispone de varios hilos, pero se aseguraría que adecuadamente el acceso al archivo controlada.

La otra cosa a tener en cuenta es que es posible que desee mover la operación de ahorro a un subproceso de fondo para escribir el archivo de salida. Si se obtiene un archivo de grandes ajustes que puede causar interacciones de interfaz de usuario extraños porque está esperando en el archivo para escribir cada vez que el usuario cambia el tamaño y esto ocurre en el subproceso de interfaz de usuario. Si hizo esto que sin duda necesita para bloquear el acceso al recurso de archivo.

También puede intentar utilizar una declaración de bloqueo. Podría ser que los métodos están invadiendo el uno al otro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top