Как при многопотоке брать уникальную строку

akella32

Client
Регистрация
24.04.2013
Сообщения
134
Благодарностей
15
Баллы
18
Приветствую. Всех с наступившим НГ. Понимаю что голова сейчас забита (залита) другим, но все же задам вопрос, а вдруг...
Шаб выполняется за 4-5 сек. Беру строку с удалением из тхт файла и выкладываю на сайт, при одном потоке все хорошо, если ставлю два потока и более, то иногда берется одна и та же строка, то есть шаб не успевает взять строку удалить и сохранить фай, во время этого процесса залетает второй поток и то же хватает эту строчку.
Вот как бы сделать, что бы всегда бралась уникальная строка?
 

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113
У меня подобно ен получилось при работе с файлом, сколько не мучался. Поищите по форуме, выкладывали решения. По идее строку надо брать сниппетом и лочить процесс взятия строки для каждого потока. Но в моем случае не сработало, перешел на работу с БД.
 
  • Спасибо
Реакции: akella32

akella32

Client
Регистрация
24.04.2013
Сообщения
134
Благодарностей
15
Баллы
18

shtift

Client
Регистрация
29.07.2015
Сообщения
148
Благодарностей
290
Баллы
63
  • Спасибо
Реакции: akella32

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113
А почему БД решает этот вопрос?
Как оказалось, в процессе работы с БД, это не совсем решает проблему получения данных при многопотоке. Часто, при запуске шаблона, выходит что потоки берут одну и туже строку. Потом, в процессе его работы уже начинает строки брать нормально. Каждый поток свою строку.

Скорость обработки данных при работе с БД и надежность значительно выше чем при работе со списком или таблицей.
 

ТРОН

Client
Регистрация
31.07.2016
Сообщения
336
Благодарностей
381
Баллы
63
Вот как бы сделать, что бы всегда бралась уникальная строка?
Есть в закромах такой сниппет, берет строку в переменную с удалением из списка, разделяет по переменным(закомментировал), добавляет строку в конец
Код:
lock(SyncObjects.ListSyncer) //Лочим для много потока
{
//Берем первую строку из списка, кладем ее в переменную и удаляем
var list = project.Lists["Данные"];
project.Variables["result"].Value = list[0];
list.RemoveAt(0);

/*
//разбиваем строку из переменной по переменным
string acc_full = project.Variables["result"].Value;
var account = acc_full.Split(';').ToList(); // ';' в ковычках находится разделяющий элемент
project.Variables["Email"].Value = account[0];
project.Variables["Password"].Value = account[1];
*/

//Дописываем в конец списка данные из переменной
string text = project.Variables["result"].Value;
list.Add(text);
}
 

akella32

Client
Регистрация
24.04.2013
Сообщения
134
Благодарностей
15
Баллы
18
Есть в закромах такой сниппет, берет строку в переменную с удалением из списка, разделяет по переменным(закомментировал), добавляет строку в конец
А не получится ли так, что раскидал я в переменные строчку, пошел постить на сайт, пока забил все по ячейка, следующий поток уже новые переменные успел хавести? То есть первым потоком я уже буду вбивать переменные второго потока
 

ТРОН

Client
Регистрация
31.07.2016
Сообщения
336
Благодарностей
381
Баллы
63
А не получится ли так, что раскидал я в переменные строчку, пошел постить на сайт, пока забил все по ячейка, следующий поток уже новые переменные успел хавести? То есть первым потоком я уже буду вбивать переменные второго потока
Так переменные же изолированы внутри потоков, если это не глобальная переменная. У каждого потока в переменных будут свои данные, общим будет только список из которого они будут брать строки, при этом каждый поток будет ждать следующий, пока он не запишет в конец списка удаленную строку.
 
  • Спасибо
Реакции: akella32

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