Как получить доступ к файлу с наименьшим количеством блокировок

StackOverflow https://stackoverflow.com/questions/229441

  •  04-07-2019
  •  | 
  •  

Вопрос

в моем приложении (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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top