lock и Процесс не может получить доступ к файлу

irving zisman

Client
Регистрация
18.05.2017
Сообщения
225
Благодарностей
28
Баллы
28
В общем есть большой проект полностью написанный на c#, возможно я где-то что-то не понимаю, отсюда и данная ошибка, посоветуйте в какую сторону вообще глядеть...
В проекте создал отдельные объекты синхронизации, для записи информации в файлы, грубо говоря под каждый файл свой объект типа
C#:
public static object lock1 = new object();
public static object lock2 = new object();
public static object lock3 = new object();
Ну и в дальнейшем когда нужно записываю данные в файл таким образом:
C#:
lock (CommonCode.lock1) File.AppendAllText(project.Directory + "\\trash1.txt", str + Environment.NewLine);
lock (CommonCode.lock2) File.AppendAllText(project.Directory + "\\trash2.txt", str + Environment.NewLine);
И по какой-то причине, во многопотоке иногда получаю сообщения с ошибкой
C#:
Выполнение действия CSharp OwnCode: test. Процесс не может получить доступ к файлу "C:\Users\Administrator\Desktop\test\trash1.txt", так как этот файл используется другим процессом.
В чем может быть проблема?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 694
Баллы
113
наверно потому что освобождение ресурса, особенно файлового, это не мгновенная операция и лок успевает выйти и зайти в другой поток. ну а там занятый файл :bk:

ну а вообще работать с файлами напрямую без try/catch , обработок ошибок, повторов обращения.... это очень плохая идея на самом деле ;-)
 
Последнее редактирование:
  • Спасибо
Реакции: irving zisman

irving zisman

Client
Регистрация
18.05.2017
Сообщения
225
Благодарностей
28
Баллы
28
наверно потому что освобождение ресурса, особенно файлового, это не мгновенная операция и лок успевает выйти и зайти в другой поток. ну а там занятый файл :bk:

ну а вообще работать с файлами напрямую без try/catch , обработок ошибок, повторов обращения.... это очень плохая идея на самом деле ;-)
Это же как код вырастет, если везде где работа с файлом добалять try/catch.... :be: Хотя есть наверное способы сделать это элегантно, засунуть в using мб, но я что-то без идей, навыков нема) А сделать проверку на занятость файла целесообразно? и возможно ли? Ну или паузу накрайняк 500мс поставить, после File.AppendAllText ?
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 694
Баллы
113
Это же как код вырастет, если везде где работа с файлом добалять try/catch.... :be: Хотя есть наверное способы сделать это элегантно, засунуть в using мб, но я что-то без идей, навыков нема) А сделать проверку на занятость файла целесообразно? и возможно ли? Ну или паузу накрайняк 500мс поставить, после File.AppendAllText ?
не вижу связи между размером кода и его правильным написанием. если нужен большой код, то он пишется. для удобного использования кода в c# есть классы.
возникшее исключение и есть проверка на занятость файла. исключение надо обрабатывать в блоке catch и принимать решение что делать дальше. либо подождать, и повторить попытку, либо выходить по ошибке.
пауза конечно может улучшить ситуацию, но лучше все таки нарыть в интернете код правильного занятия и освобождения ресурса, благо такого почти на каждом тематическом ресурсе полно.
 
  • Спасибо
Реакции: irving zisman

irving zisman

Client
Регистрация
18.05.2017
Сообщения
225
Благодарностей
28
Баллы
28
не вижу связи между размером кода и его правильным написанием. если нужен большой код, то он пишется. для удобного использования кода в c# есть классы.
возникшее исключение и есть проверка на занятость файла. исключение надо обрабатывать в блоке catch и принимать решение что делать дальше. либо подождать, и повторить попытку, либо выходить по ошибке.
пауза конечно может улучшить ситуацию, но лучше все таки нарыть в интернете код правильного занятия и освобождения ресурса, благо такого почти на каждом тематическом ресурсе полно.
Спасибо за мысль! пойду искать как сделать проверку на занятость
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)