C# Помогите найти ошибку в коде для работы с файлами в многопотоке

Регистрация
23.03.2015
Сообщения
1 211
Благодарностей
745
Баллы
113
Нужно брать файлы из папки в многопотоке, для этого реализовал эту идею:
С кодом почти не работаю, но скрепя извилинами, получилось сваять такую конструкцию:
C#:
var List = project.Lists["Pathlist"];
bool listFile;
var dirFiles = Directory.GetFiles(@project.Directory + "\\Files\\");

lock(SyncObjects.ListSyncer)
{
if(!System.IO.File.Exists(project.Directory + "\\Pathlist.txt"))
{
    foreach(string file in dirFiles)
    {   
        List.Add(file);
    }
}
var List = List[0];
List.RemoveAt(0);
project.Variables["file"].Value = List.ToString();   
}
Вроде кот работает верно, но в некоторых случаях вот несколько раз берёт адреса файлов в директории в список. Получается не срабатывает блокировка потока. Подскажите в чём может быть проблема?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
project.Lists["Pathlist"] общий на все потоки или нет ?
List наполняется всеми строками из dirFiles , каждый раз, а удаляется только первая строка. Если List файл общий, то значит туда постоянно дубли складываются. Если не общий, то зачем удалять первую строку ?
В разделе лока не происходит удаление файлов из директории @project.Directory + "\\Files\\" , это значит что все потоки загружают в dirFiles один и тот же список. Если он локальный то данные у всех одинаковые до момента изменнеия дирректории, если список общий, то туда дубли постоянно попадают.
Вывод, код надо полностью менять, как и общую логику работы в многопотоке.

Если на кубиках, то, скачай бесплатный шаблон для клиентов, нагул кук, там это реализовано
 
Регистрация
23.03.2015
Сообщения
1 211
Благодарностей
745
Баллы
113
project.Lists["Pathlist"] общий на все потоки или нет ?
Pathlist привязан к одноименному файлу, если строки кончаются файл исчезает.
Я сейчас обязательно посмотрю как это реализовано в шаблоне с нагуливание кук, но всё же не могу понять почему добавляются дубли? Ведь в коде используется блокировка списка.
Когда один поток обращается к коду срабатывает блокировка, есть ли файл где лежат адреса файлов существует берётся одна строка, если файла нету(соответственно список пуст), идёт наполнение списка и только потом берётся строка. И только после этих действий снимается блокировка. Получается когда другое поток сможет работать с этим кодом, файл уже будет существовать и он не должен наполнять список заново. Или я неправильно понял принцип блокировки?
 
Регистрация
23.03.2015
Сообщения
1 211
Благодарностей
745
Баллы
113
Если на кубиках, то, скачай бесплатный шаблон для клиентов, нагул кук, там это реализовано
1635496751762.png
Вы про эту реализацию?
Если да, то не знаю как это может помочь... У меня были десятки случаев когда несколько потоков брали одну и ту же строчку.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
опять же. если идет проверка на наличие файла, то в локе этот файл не создается и не удаляется. как я понял это возложено на механизм зенки. а этот механизм всегда работает с задержкой для внешних ресурсов.
Поэтому если через проверку наличия файла, то надо самостоятельно создавать/удалять файл метку (не файл-список) и дополнительно нужен цикл контроля выполнения операции с каким то таймаутом, что бы в локе не зависнуть навсегда. естественно все это внутри лока. так же можно метку организовать в глобальных переменных.
Можно и без меток. проверять надо не наличие файла на диске, а количество строк в списке, этот метод обращается к внутреннему кешу зенки и там для момента лока будут валидные данные.
 
  • Спасибо
Реакции: KolkaPetkinSyn

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