Как избежать блокировки файлов - PullRequest
1 голос
/ 20 октября 2008

Мы следим за развитием настроенного приложения (чей источник не находится под нашим контролем), которое записывает в манифест 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
    }
}

Ответы [ 5 ]

2 голосов
/ 20 октября 2008

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

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

1 голос
/ 20 октября 2008

Две вещи:

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

НТН.

0 голосов
/ 21 октября 2008

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

string xmlText = File.ReadAllText(ManifestFile);

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

0 голосов
/ 21 октября 2008

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

0 голосов
/ 20 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...