Как получить доступ к файлу с наименьшим количеством блокировок
Вопрос
в моем приложении (c # 3.5) есть различные процессы, которые очень часто обращаются к одному XML-файлу (чтение и запись). код, обращающийся к файлу, помещается в сборку, на которую ссылается довольно много других приложений. например, служба Windows может создать экземпляр класса MyFileReaderWriter (расположенный в ранее упомянутой сборке) и использовать методы чтения / записи этого класса. Р>
Я ищу лучший / самый быстрый способ чтения и создания / добавления файла с наименьшим количеством блокировок. кэширование данных в файлах и периодическая очистка нового содержимого невозможны, поскольку данные являются критическими.
Я забыл упомянуть, что в настоящее время я использую XDocument (инфраструктура LInq2Xml) для чтения / записи содержимого в файл.
Решение
Для начала убедитесь, что весь доступ к документу XML осуществляется через один экземпляр.
Затем установите механизм блокировки (ожидающий разблокировки) в начале функции, которая обращается к ней, и разблокируйте ее в конце.
Другие советы
Если при написании вы только добавляете документ, попробуйте это
http://msdn.microsoft.com/en-us/library /aa302289.aspx р>
Ваш xml документ - это оболочка с начальным и конечным тегами. Между тегами находится ссылка включения, которая ссылается на другой файл, этот другой файл является телом XML-документа. Для операций записи это во много раз быстрее, потому что вам не нужно загружать XML-файл каждый раз, когда вы пишете в него, и вы не пишете весь файл каждый раз.
Используя класс XmlWriter, вы можете очень легко добавить узлы в конец файла тела.
Когда другие хотят прочитать xml, они просто открывают документ, их синтаксический анализатор xml знает " загрузить и проанализировать оба файла.
Надеюсь, это поможет.
Что вы имеете в виду, данные важны? Файл XML не используется исключительно вашим приложением?
Простым (и, возможно, достаточно хорошим) способом блокировки доступа ввода-вывода к файлу было бы создание статического фабричного класса, который предоставляет маркер чтения и записи. возражать, что каждая операция ввода-вывода должна иметь блокировку.
public static object GetReadWriteToken(String fileName)
{
//use a hashtable to retreive an object, with filename as key
return token;
}
и просто сделайте это во время чтения и записи:
lock(GetReadWriteToken(@"C:\important.xml"))
{
//io code
}