Question

Dans mon application (c # 3.5), plusieurs processus accèdent très souvent à un seul fichier xml (lecture et écriture). le code accédant au fichier est placé dans un assemblage référencé par plusieurs autres applications. Par exemple, un service Windows peut instancier la classe MyFileReaderWriter (localisée dans l'assembly mentionné précédemment) et utiliser les méthodes de lecture / écriture de cette classe.

Je cherche le moyen le plus rapide / le meilleur pour lire et créer / ajouter le fichier avec le moins de verrouillage possible. mettre en cache les données des fichiers et vider périodiquement le nouveau contenu n'est pas une option, car les données sont essentielles.

J'ai oublié de mentionner que j'utilise actuellement XDocument (infrastructure LInq2Xml) pour lire / écrire le contenu dans le fichier.

Était-ce utile?

La solution

Pour commencer, assurez-vous que tous les accès au document XML sont effectués via une seule instance.

Mettez ensuite un mécanisme de verrouillage (qui attend le déverrouillage) au début de la fonction pour y accéder et le déverrouiller à la fin.

Autres conseils

Si, en écrivant, vous ne faites qu'ajouter au document, essayez ceci

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

Fondamentalement, votre document XML est un shell avec une balise de début et de fin. Entre les balises, il y a une référence à l'inclusion, qui fait référence à un autre fichier, cet autre fichier est le corps du document XML. Pour les opérations d'écriture, cela est beaucoup plus rapide, car vous n'avez pas à charger le fichier xml à chaque écriture, et vous n'écrivez pas l'intégralité du fichier à chaque fois.

En utilisant une classe XmlWriter, vous pouvez facilement ajouter des nœuds à la fin du fichier body.

Lorsque les autres souhaitent lire le fichier XML, ils ouvrent simplement le document, leur analyseur syntaxique XML "know "". charger et analyser les deux fichiers.

J'espère que cela vous aidera.

Qu'entendez-vous par "données critiques"? Le fichier XML n'est-il pas exclusivement utilisé par votre application?

Un moyen simple (et peut-être suffisant) de verrouiller l'accès IO au fichier consiste à créer une classe d'usine statique fournissant un "jeton de lecture / écriture". objet sur lequel chaque opération d’entrée / sortie doit être verrouillée.

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

et faites simplement ceci en lisant et en écrivant:

lock(GetReadWriteToken(@"C:\important.xml"))
{
    //io code
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top