Pregunta

en mi aplicación (c # 3.5) hay varios procesos que acceden a un solo archivo xml (lectura y escritura) con mucha frecuencia. el código que accede al archivo se coloca en un ensamblaje al que hacen referencia un par de otras aplicaciones. por ejemplo, un servicio de Windows podría crear una instancia de la clase MyFileReaderWriter (ubicada en el ensamblaje mencionado anteriormente) y utilizar los métodos de lectura / escritura de esta clase.

Estoy buscando la forma mejor / más rápida de leer y crear / adjuntar el archivo con la menor cantidad de bloqueo. el almacenamiento en caché de los datos de los archivos y el vaciado del contenido nuevo periódicamente no es una opción, ya que los datos son críticos.

Olvidé mencionar que actualmente uso XDocument (infraestructura LInq2Xml) para leer / escribir el contenido en el archivo.

¿Fue útil?

Solución

Para empezar, asegúrese de que todo el acceso al documento XML se realice a través de una sola instancia.

Luego, coloque un mecanismo de bloqueo (que espere a que se desbloquee) al principio de la función que lo accede y desbloquéelo al final.

Otros consejos

Si al escribir solo está agregando al documento, intente esto

http://msdn.microsoft.com/en-us/library /aa302289.aspx

Básicamente, su documento xml es un shell con una etiqueta de inicio y fin. Entre las etiquetas hay una referencia de inclusión, que hace referencia a otro archivo, este otro archivo es el cuerpo del documento xml. Para las operaciones de escritura, esto es mucho más rápido, ya que no tiene que cargar el archivo xml cada vez que escribe en él, y no escribe todo el archivo cada vez.

Usando una clase XmlWriter, puedes agregar nodos al final del archivo del cuerpo muy fácilmente.

Cuando otros quieren leer el xml, simplemente abren el documento, su analizador xml " sabe " para cargar y analizar ambos archivos.

Espero que esto ayude.

¿Qué quieres decir con que los datos son críticos? ¿El archivo XML no es utilizado exclusivamente por su aplicación?

Una forma simple (y quizás lo suficientemente buena) de bloquear el acceso de E / S al archivo sería crear una clase de fábrica estática que proporcione un " token de lectura " Objeto que cada operación de E / S debería tener un bloqueo activado.

public static object GetReadWriteToken(String fileName)
{
    //use a hashtable to retreive an object, with filename as key
    return token;
}

y simplemente haga esto mientras lee y escribe:

lock(GetReadWriteToken(@"C:\important.xml"))
{
    //io code
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top