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

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

akella32

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

Скорость обработки данных при работе с БД и надежность значительно выше чем при работе со списком или таблицей.
 
Вот как бы сделать, что бы всегда бралась уникальная строка?
Есть в закромах такой сниппет, берет строку в переменную с удалением из списка, разделяет по переменным(закомментировал), добавляет строку в конец
Код:
Развернуть Свернуть Копировать
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

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