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

в моем приложении (C# 3.5) различные процессы очень часто обращаются к одному XML-файлу (чтение и запись). код доступа к файлу помещается в сборку, на которую ссылается довольно много других приложений. например, служба Windows может создать экземпляр класса MyFileReaderWriter (расположенный в ранее упомянутой сборке) и использовать методы чтения / записи этого класса.

Я ищу лучший / самый быстрый способ читать и создавать / добавлять файл с наименьшим количеством блокировок. Кэширование данных файлов и периодическая очистка нового содержимого не подходят, поскольку данные критически важны.

Я забыл упомянуть, что в настоящее время я использую XDocument (инфраструктура LInq2Xml) для чтения / записи содержимого в файл.

Несколько дней назад я столкнулся с похожим «состоянием», с нетерпением жду ответов :)

leppie 23.10.2008 15:58

Если подумать, разве это не говорит о проблеме программирования? Даже если фактический ввод-вывод диска не является проблемой, существует риск, что один поток блокирует файл, читает, делает что-то еще, а затем возвращается, записывает результат и снимает блокировку. Между тем все остальные потоки заблокированы.

biozinc 23.10.2008 16:10

Есть ли причина, по которой вы не можете использовать БД?

NM. 23.10.2008 16:24

@biozinc: будет несколько процессов, обращающихся к файлу, но не несколько потоков в одном процессе. Насколько я понимаю, это не проблема многопоточности, а проблема "контроля доступа к файлам".

Mats 23.10.2008 16:27

@NM: да, к сожалению, я не могу использовать db по разным причинам. это должен быть файл xml.

Mats 23.10.2008 16:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
602
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Для начала убедитесь, что весь доступ к 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
}

Если, написав, вы только добавляете в документ, попробуйте это

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

В основном ваш XML-документ представляет собой оболочку с начальным и конечным тегами. Между тегами находится ссылка включения, которая ссылается на другой файл, этот другой файл является телом XML-документа. Для операций записи это происходит во много раз быстрее, потому что вам не нужно загружать XML-файл каждый раз, когда вы пишете в него, и вы не записываете каждый раз весь файл.

Используя класс XmlWriter, вы можете очень легко добавлять узлы в конец основного файла.

Когда другие хотят прочитать xml, они просто открывают документ, их синтаксический анализатор xml «знает», что нужно загружать и анализировать оба файла.

Надеюсь это поможет.

Другие вопросы по теме