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

  • Автор темы Автор темы backoff
  • Дата начала Дата начала

backoff

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

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

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

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

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

ps \ и пожалуйста расписывайте свои мысли как можно подробнее
 
действия "взять конфиг", "прибавить", "перезаписать" нужно перенести в плоскость кода и обернуть в лок
док, я это понимаю, вот как именно это сделать? помоги со сниппетом плиз
чуть позже скину кусок кубиков, что за это отвечают
 
Добавь файл, в котором будет список твоих файлов (file_4,file_5, ...). В проекте загрузи этот файл как список, и бери с него каждый раз первую строку. Таким образом в многопотоке зенно будет брать каждый раз следующий файл, и один и тот же поток не будет обрабатывать одинаковый файл.
Еще можно делать через глобальные переменные, записывая туда название последнего файла который брался в работу, но с ними не работал.
 
док, я это понимаю, вот как именно это сделать? помоги со сниппетом плиз
чуть позже скину кусок кубиков, что за это отвечают
Код:
Развернуть Свернуть Копировать
string path = @"C:\\file.txt";

lock (SyncObject)
{
    int num = int.Parse(File.ReadAllText(path));
    File.WriteAllText(path, Convert.ToString(++num));
   
    return num;
}
 
В проекте загрузи этот файл как список, и бери с него каждый раз первую строку
можно, конечно, но это я называю "через задницу" ... хотя раньше я так и делал ))) но мы растем же над собой!
Еще можно делать через глобальные переменные
пытался разобраться с ними, но так и не въехал, проще оказалось делать отдельные конфиги

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

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


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

короче решил не париться и сделать через лок списка
https://zennolab.com/discussion/thr...-i-polozhit-v-konec-spiska.27242/#post-191101
 
Последнее редактирование:
короче по факту код не работает :-)
если кто соберется делать так же, ищу снова способы
Я так понимаю, что у тебя не залочено обращение к спискам.
Этот код только лочит перезапись в твой файл конфига. Т.е. меняет цифры 4, 5, 6...
Но если у тебя несколько потоков одновременно поняли, что файл закончился, то они все обратятся к этому снипеты и поочереди выполнят +1, каждый дождавшись своей очереди.
Т.е. тебе также надо лочить определение, что файл закончился. А в данном снипете ты только лочишь перезапись значения.

PS Так что все работает. Просто надо логику шаблона дорабатывать.
 
Т.е. тебе также надо лочить определение, что файл закончился
Да, верно, но так как не прогер, я организовал проверку на кубиках с рандомной задержкой, если все правильно понял, то должно работать нормально.
Если не сложно можно ли просто полный кусок кода выложить для шарпа?
 
Почему бы не использовать sql. С этими файлами один геморрой
 
Почему бы не использовать sql. С этими файлами один геморрой
ну честно говоря особого гемора не встретил, все время с файлами работаю, но с такой огромной базой конечно не работал, тем более пополняется и растет...
просто изначально было написано все на файлах, поэтому переписывать - это будет реально геморно, да и все работает, не хочу трогать :)
будущие проекты буду уже на sql пилить
 
Код:
Развернуть Свернуть Копировать
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 строчка файла на выходе, с удалением и перезапись файла
}

Попробуйте так.
 

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