Проблема с многопоточностью

dontline

Client
Регистрация
16.03.2020
Сообщения
3
Благодарностей
1
Баллы
3
Добрый день, в первый раз составил шаблон на работе с GET/POST запросами (картинка 1) и столкнулся проблемой при работе в ZennoPoster в режиме нескольких потоков. Логин из таблицы берётся по несколько раз (картинка 2).
Буду признателен за помощь или линк на обсуждение данной проблемы.
 

Вложения

  • 50,4 КБ Просмотры: 105
  • 184,4 КБ Просмотры: 111

GraaFf

Client
Регистрация
21.05.2016
Сообщения
126
Благодарностей
53
Баллы
28
Если брать из таблицы с последующим удалением элемента из этой таблицы, то элемент удаляется не сразу (по крайне мере наблюдал у себя такое поведение). Во вторых идёт параллельная работа потоков, то есть несколько потоков могут одновременно работать с одной таблицей, тем самым и получается так, что несколько потоков подхватывают одинаковые данные. Выход прост, используй локи.
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 333
Благодарностей
5 431
Баллы
113

dontline

Client
Регистрация
16.03.2020
Сообщения
3
Благодарностей
1
Баллы
3

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 333
Благодарностей
5 431
Баллы
113
C#:
IZennoList proxyList = project.Lists["Proxy"]; //Получаем указатель на лист с проксями
lock (SyncObjects.ListSyncer)
{
   string proxy = proxyList[0];
   proxyList.RemoveAt(0);
   proxyList.Add(proxy); // записываем живую проксю в конец списка*
   project.Variables["proxy"].Value = protocol + proxy; // назначем прокси в переменную
   System.Threading.Thread.Sleep(1 * 400);
}
По строкам
1) Поменяй Proxy на название своего списка
5) Взять первую строку
6) Записать строку в конец
7) Поменяй proxy на имя своей перменной (без variable)

Этот код для списков.
Сам код в кубик C#.

Коротко, что такое лок. Пока идет работа со списком, другие потоки стоят в очереди. Тем самым исключается возможность взятия одной строки несколькими потоками одновременно. Я еще ставлю паузу в начале работы 1-10, что бы потоки не выполнялись синхронно.
 
Последнее редактирование:
Регистрация
28.06.2016
Сообщения
302
Благодарностей
17
Баллы
18
C#:
IZennoList proxyList = project.Lists["Proxy"]; //Получаем указатель на лист с проксями
lock (SyncObjects.ListSyncer)
{
   string proxy = proxyList[0];
   proxyList.RemoveAt(0);
   proxyList.Add(proxy); // записываем живую проксю в конец списка*
   project.Variables["proxy"].Value = protocol + proxy; // назначем прокси в переменную
   System.Threading.Thread.Sleep(1 * 400);
}
По строкам
1) Поменяй Proxy на название своего списка
5) Взять первую строку
6) Записать строку в конец
7) Поменяй proxy на имя своей перменной (без variable)

Этот код для списков.
Сам код в кубик C#.

Коротко, что такое лок. Пока идет работа со списком, другие потоки стоят в очереди. Тем самым исключается возможность взятия одной строки несколькими потоками одновременно. Я еще ставлю паузу в начале работы 1-10, что бы потоки не выполнялись синхронно.

Подскажите как изменить данный код?
нужно
- залочить конкретный список
- получить строку с удалением и положить её в переменную
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
742
Баллы
113
С удалением и берет первую строку и в конец
C#:
lock(Locker.Задания)
{

IZennoList list = project.Lists["Лист_1"];
list.Bind(@project.Variables["B"].Value);
//Данный код берет прокси из списка proxyes.txt с ротацией. (берет первую строку и возвращает в конец)

string proxy_full = String.Empty;

lock(Locker.Задания)
{
    proxy_full = project.Lists["Лист_1"].GetItem("0", true);
  project.Lists["Лист_1"].Add(proxy_full);
}

project.Variables["url"].Value = proxy_full;  
}

lock(Locker.Задания)
{
// Привязать список к файлу
IZennoList list = project.Lists["Лист_1"];
list.Bind(@project.Variables["B"].Value);
var stroka1 = project.Lists["Лист_1"][0];
project.Lists["Лист_1"].RemoveAt(0);
project.Variables["url"].Value = stroka1;
}
 
  • Спасибо
Реакции: Mikhail B.

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