Помогите взять содержимое файла в многопотоке

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
имеем кучу файлов вида

file_1.txt
file_2.txt
....
file 30 и тд
из них поочередно берется текст

логика шаблона следующая:
когда шаблон видит, что файл закончился, он берет из файла конфига цифру и к этой цифре прибавляет +1, то есть должен идти по очередно, но я не учел многопоток, и бывает туже самую операцию делают еще пара потоков и получается что прибавляется не +1, а +3 +5
и если у нас был в работе file_4 и должен стать file_5, то на деле получается file_7 10 и тп

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

спасибо за советы

ps \ и пожалуйста расписывайте свои мысли как можно подробнее
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
действия "взять конфиг", "прибавить", "перезаписать" нужно перенести в плоскость кода и обернуть в лок
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
действия "взять конфиг", "прибавить", "перезаписать" нужно перенести в плоскость кода и обернуть в лок
док, я это понимаю, вот как именно это сделать? помоги со сниппетом плиз
чуть позже скину кусок кубиков, что за это отвечают
 

denstadnyk

Client
Регистрация
17.07.2014
Сообщения
6
Благодарностей
14
Баллы
3
Добавь файл, в котором будет список твоих файлов (file_4,file_5, ...). В проекте загрузи этот файл как список, и бери с него каждый раз первую строку. Таким образом в многопотоке зенно будет брать каждый раз следующий файл, и один и тот же поток не будет обрабатывать одинаковый файл.
Еще можно делать через глобальные переменные, записывая туда название последнего файла который брался в работу, но с ними не работал.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
док, я это понимаю, вот как именно это сделать? помоги со сниппетом плиз
чуть позже скину кусок кубиков, что за это отвечают
Код:
string path = @"C:\\file.txt";

lock (SyncObject)
{
    int num = int.Parse(File.ReadAllText(path));
    File.WriteAllText(path, Convert.ToString(++num));
   
    return num;
}
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
В проекте загрузи этот файл как список, и бери с него каждый раз первую строку
можно, конечно, но это я называю "через задницу" ... хотя раньше я так и делал ))) но мы растем же над собой!
Еще можно делать через глобальные переменные
пытался разобраться с ними, но так и не въехал, проще оказалось делать отдельные конфиги

док, спасибо, попробую
помоги со сниппетом на примере плиз, там просто есть проверка

действие начинается, если список пуст (выход по ошибке)


обновлено...

короче решил не париться и сделать через лок списка
https://zennolab.com/discussion/threads/vzjat-s-nachala-spiska-i-polozhit-v-konec-spiska.27242/#post-191101
 
Последнее редактирование:

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
короче по факту код не работает :-)
если кто соберется делать так же, ищу снова способы
 

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
короче по факту код не работает :-)
если кто соберется делать так же, ищу снова способы
Я так понимаю, что у тебя не залочено обращение к спискам.
Этот код только лочит перезапись в твой файл конфига. Т.е. меняет цифры 4, 5, 6...
Но если у тебя несколько потоков одновременно поняли, что файл закончился, то они все обратятся к этому снипеты и поочереди выполнят +1, каждый дождавшись своей очереди.
Т.е. тебе также надо лочить определение, что файл закончился. А в данном снипете ты только лочишь перезапись значения.

PS Так что все работает. Просто надо логику шаблона дорабатывать.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
Т.е. тебе также надо лочить определение, что файл закончился
Да, верно, но так как не прогер, я организовал проверку на кубиках с рандомной задержкой, если все правильно понял, то должно работать нормально.
Если не сложно можно ли просто полный кусок кода выложить для шарпа?
 

vrska

Client
Регистрация
07.02.2010
Сообщения
589
Благодарностей
408
Баллы
63
Почему бы не использовать sql. С этими файлами один геморрой
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
Почему бы не использовать sql. С этими файлами один геморрой
ну честно говоря особого гемора не встретил, все время с файлами работаю, но с такой огромной базой конечно не работал, тем более пополняется и растет...
просто изначально было написано все на файлах, поэтому переписывать - это будет реально геморно, да и все работает, не хочу трогать :-)
будущие проекты буду уже на sql пилить
 

dr1veq

Пользователь
Регистрация
09.02.2018
Сообщения
39
Благодарностей
44
Баллы
18
Код:
lock(SyncObject) {
string success = "NO";
var listFiles = project.Lists["list"]; // лист со списком файлов;
string result = "";


if(listFiles.Count == 0)
{
    project.SendErrorToLog("Список файлов пуст!", true);   
    throw new Exception("Список файлов пуст");   // Ошибка если в списке нет файлов
}
while (success == "NO")
{
string pathFile = listFiles[0];
List<string> list1 = File.ReadAllLines(@pathFile).ToList();

if (list1.Count == 0) // Если файл пустой, удаляем со списка
{
    listFiles.RemoveAt(0);
    continue;
}
result = list1[0];
list1.RemoveAt(0);
File.WriteAllLines(pathFile, list1.ToArray());
success = "YES";
}

return result;  // 1 строчка файла на выходе, с удалением и перезапись файла
}
Попробуйте так.
 

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