Как избежать блокировки файлов

Мы отслеживаем прогресс настроенного приложения (чей источник не находится под нашим контролем), которое записывает в XML-манифест. Иногда приложение зависает из-за невозможности записи в файл манифеста. Хотя мы покрываем наши следы, явно закрывая дескриптор файла с помощью File.Close, а также создавая файловые переменные в Using Blocks. Но почему-то это продолжается. (Наше приложение является многопоточным, и к файлу могут обращаться не более трех потоков.) Еще одна интересная вещь заключается в том, что их приложение обновляет этот манифест при трех разных событиях (добавление элементов, удаление элементов, завершение элементов), но мы страдаем только из-за одного события (завершения элементов). Мой код указан здесь

using (var st = new FileStream(MenifestPath, FileMode.Open, FileAccess.Read))
{
    using (TextReader r = new StreamReader(st))
    {
       var xml = r.ReadToEnd();
           r.Close();
           st.Close();
          //................ Rest of our operations
    }
}

надеюсь, что следующая ссылка поможет. stackoverflow.com/questions/119548/…

pradeeptp 20.10.2008 15:31

Совершенно правильный поступок - использовать блокировку, чтобы потоки не пытались одновременно получить доступ к файлу. Сработало для меня, когда у меня несколько потоков записываются в один и тот же файл. Создайте библиотеку для управления доступом к файлу, и вы золотые.

ScottCher 20.10.2008 17:44
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
850
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Проблема в другом, потому что этот человек имеет полный контроль над доступом к файлам для всех процессов, в то время как, как я уже упоминал, ОДИН ПРОЦЕСС ЯВЛЯЕТСЯ ТРЕТЬЕЙ СТОРОНОЙ БЕЗ ДОСТУПА К ИСТОЧНИКУ. И наши приложения работают нормально. Однако их приложение кажется зависшим, если они не могут получить контроль над файлом. Поэтому я хочу найти способ доступа к файлам, который не мешал бы их работе.

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

Если вы только читаете из файла, вы должны иметь возможность передать флаг, чтобы указать режим совместного использования. Я не знаю, как вы указываете это в .NET, но в WinAPI вы бы передали FILE_SHARE_READ | FILE_SHARE_WRITE в CreateFile().

Я предлагаю вам проверить документацию по файловому API, чтобы узнать, где упоминаются режимы совместного использования.

Ага, есть константа FileShare. Спасибо, я попробую и посмотрю, как это работает

Gripsoft 20.10.2008 16:41

Благодаря добавлению константы FileShare оба потока приложения, кажется, понимают друг друга. Поскольку наше приложение только что читало, я просто использовал атрибут READ_WRITE для других файлов, поэтому их приложение всегда открывает файл.

Gripsoft 21.10.2008 14:35

Две вещи:

  1. Остальные операции следует выполнять за рамками операторов using. Таким образом, вы не рискуете использовать закрытый поток и ридер. Кроме того, вам не нужно использовать методы Close, потому что при выходе из области действия оператора using вызывается Dispose, что эквивалентно.
  2. Следует использовать перегрузку с перечислением FileShare. Блокировка носит параноидальный характер, поэтому файл может быть заблокирован автоматически, чтобы защитить вас от вас самих. :)

HTH.

Это могло произойти, если один поток пытался читать из файла, в то время как другой записывал. Чтобы избежать такой ситуации, когда вы хотите, чтобы несколько считывателей, но только один модуль записи одновременно, использовали ReaderWriterLock или в .NET 2.0 класс ReaderWriterLockSlim в пространстве имен System.Threading.

Кроме того, если вы используете .NET 2.0+, вы можете упростить свой код, чтобы просто:

string xmlText = File.ReadAllText(ManifestFile);

См. Также: File.ReadAllText в MSDN.

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