Domanda

nella mia applicazione (c # 3.5) ci sono vari processi che accedono a un singolo file XML (lettura e scrittura) molto frequentemente. il codice che accede al file viene inserito in un assembly a cui fanno riferimento un bel po 'di altre applicazioni. ad esempio un servizio di Windows potrebbe istanziare la classe MyFileReaderWriter (localizzata nell'assembly precedentemente menzionato) e utilizzare i metodi di lettura / scrittura di questa classe.

Sto cercando il modo migliore / più veloce per leggere e creare / aggiungere il file con il minor numero di blocchi. la memorizzazione nella cache dei dati dei file e lo svuotamento periodico dei nuovi contenuti non è un'opzione, poiché i dati sono fondamentali.

Ho dimenticato di menzionare che attualmente uso XDocument (infrastruttura LInq2Xml) per leggere / scrivere il contenuto nel file.

È stato utile?

Soluzione

Per cominciare, assicurati che tutto l'accesso al Documento XML sia fatto attraverso una singola istanza.

Quindi metti un meccanismo di blocco (che aspetta lo sblocco) all'inizio della funzione che lo accede e lo sblocca alla fine.

Altri suggerimenti

Se scrivendo stai solo aggiungendo al documento, prova questo

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

Fondamentalmente il tuo documento XML è una shell con un tag di inizio e fine. Tra i tag c'è un riferimento include, che fa riferimento a un altro file, questo altro file è il corpo del documento XML. Per le operazioni di scrittura questo è molte volte più veloce, perché non è necessario caricare il file xml ogni volta che si scrive su di esso e non si scrive l'intero file ogni volta.

Usando una classe XmlWriter puoi facilmente aggiungere nodi alla fine del file body.

Quando altri vogliono leggere l'xml, aprono semplicemente il documento, il loro parser xml "lo sa" per caricare e analizzare entrambi i file.

Spero che questo aiuti.

Cosa intendi con che i dati sono critici? Il file XML non è utilizzato esclusivamente dalla tua applicazione?

Un modo semplice (e forse abbastanza buono) per bloccare l'accesso IO al file sarebbe quello di creare una classe di fabbrica statica che fornisca un token di "lettura e scrittura". oggetto che ogni operazione I / O dovrebbe avere un blocco.

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

e fai semplicemente questo mentre leggi e scrivi:

lock(GetReadWriteToken(@"C:\important.xml"))
{
    //io code
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top