В большинстве ****ов есть пропуски, они возникают, когда в потоках без параметров нет синхронизации. Давайте же исправим этот недочет. В самом начале вашего основного класса создайте объект sync: public Object sync = new Object(); Код public Object sync = new Object(); В самом потоке описываем код, отвечающий за выборку email:pass (login:pass) из основной базы: Сначала создадим приватную (доступная только в текущем потоке) переменную line, она будет содержать строку из базы: string line; Код string line; Далее выбираем строку из базы: lock (sync) { line = ArrayLines[i]; } Код lock (sync) { line = ArrayLines[i]; } *где i - текущий индекс массива (т.е. тип "пройдено строк"), ArrayLines - ваш массив со строками В моём проекте код выглядит следующим образом: public void ProxyThread () { string line; while (i < CountLines) { lock (sync) { line = ArrayLines[i]; i++; } try { // code } catch { // code } } } Код public void ProxyThread () { string line; while (i < CountLines) { lock (sync) { line = ArrayLines[i]; i++; } try { // code } catch { // code } } }
Спасибо, очень годно), как раз подобным занимаюсь, очень интересно, правда сложно не много, но все же)
Увеличивать значение i нужно тоже в lock'е, ибо можно просто пропустить какой либо из элементов в массиве, если будет одновременно получен туда доступ из разных потоков
iPro_inactive, а как тебе идея насчёт перебрута? Ибо когда в кэтче уменьшаешь кол-во прочеканных, аккаунт тупо не чекается дальше из-за большого количества потоков? Типо такая: Пытаемся законнектится, если коннекта нет, то меняем проксю, увеличиваем переменную "всего прочекано", вводим переменную для визуального отображения в форме, мы ее не увеличиваем, а аккаунт, который пытались проверить суем в конец массива со строками, типо Array.Resize + baza[total_checked] = line; Теперь все аккаунты, которые чекались через бэд ******, будут проверяться в конце, могу код набросать
А тут ничего не надо выдумывать, нужно вместо массивов и List'ов использовать очереди - Queue, в случае хреновой ****** или чего либо еще, просто добавлять аккаунт обратно. Это идеальный вариант, и рабочий самое главное. Проблем с недобрутом не наблюдал
Рекурсию делать нельзя, потому что на каждый новый объект запроса будет заниматься новая память, и так до тех пор пока из рекурсии не выйдешь, из-за хреновых проксих или т.п. из нее можно никогда не выйти
Ну тогда использовать конструкции while(true) при обработке каждого запроса. При добавлении элемента назад в список можно столкнуться с несколькими критовыми траблами
iPro_inactive, кажется, допер. Сначала создаем очередь (Queue myQ = new Queue(); - при старте потока) Потом в потоках добавляем myQ.Enqueue(line) Типо, если плохая прокся, то мы ее меняем, если это бэд или гуд (хорошая прокся), то делаем myQ.Dequeue(line) Отличная идея, если честно, не знал про это