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





Проблема в другом, потому что этот человек имеет полный контроль над доступом к файлам для всех процессов, в то время как, как я уже упоминал, ОДИН ПРОЦЕСС ЯВЛЯЕТСЯ ТРЕТЬЕЙ СТОРОНОЙ БЕЗ ДОСТУПА К ИСТОЧНИКУ. И наши приложения работают нормально. Однако их приложение кажется зависшим, если они не могут получить контроль над файлом. Поэтому я хочу найти способ доступа к файлам, который не мешал бы их работе.
Если вы только читаете из файла, вы должны иметь возможность передать флаг, чтобы указать режим совместного использования. Я не знаю, как вы указываете это в .NET, но в WinAPI вы бы передали FILE_SHARE_READ | FILE_SHARE_WRITE в CreateFile().
Я предлагаю вам проверить документацию по файловому API, чтобы узнать, где упоминаются режимы совместного использования.
Ага, есть константа FileShare. Спасибо, я попробую и посмотрю, как это работает
Благодаря добавлению константы FileShare оба потока приложения, кажется, понимают друг друга. Поскольку наше приложение только что читало, я просто использовал атрибут READ_WRITE для других файлов, поэтому их приложение всегда открывает файл.
Две вещи:
using. Таким образом, вы не рискуете использовать закрытый поток и ридер. Кроме того, вам не нужно использовать методы Close, потому что при выходе из области действия оператора using вызывается Dispose, что эквивалентно.FileShare. Блокировка носит параноидальный характер, поэтому файл может быть заблокирован автоматически, чтобы защитить вас от вас самих. :)HTH.
Это могло произойти, если один поток пытался читать из файла, в то время как другой записывал. Чтобы избежать такой ситуации, когда вы хотите, чтобы несколько считывателей, но только один модуль записи одновременно, использовали ReaderWriterLock или в .NET 2.0 класс ReaderWriterLockSlim в пространстве имен System.Threading.
Кроме того, если вы используете .NET 2.0+, вы можете упростить свой код, чтобы просто:
string xmlText = File.ReadAllText(ManifestFile);
См. Также: File.ReadAllText в MSDN.
надеюсь, что следующая ссылка поможет. stackoverflow.com/questions/119548/…