Почему потоки проверяют одно и то же самое?
Вообщем, я сделал такой вот код. Смысл этой программы таков: это чекер прокси, который проверяет их ( прокси ) и выдает результат. Сделал для него 10 потоков, но тут у меня возникла проблема: все эти потоки проверяют один и тот же прокси, а к тому же и последний в списке ( т.е если я загрузил 3000 прокси, он проверяет именно 3000-ый.) В чём возникла проблема? Заранее прошу вас простить меня за макаронный и "костыльный" код
class Program
{
// С помощью этого статистического поля я сохраняю дальше в коде последнее значение.
public static int mincoun = 0;
// Метод для чека прокси. С помощью параметров min и max я ставлю диапазон тех прокси, которые надо проверить.
public static void Checker(string[] ms, int min, int max)
{
// Оборачиваю это всё в цикл for, дабы при отлавливании исключения чекер переходил к следующей прокси.
for (int j = min; j <= max; j++)
{
// Переменная, которую я использую в блоке catch, потому что там недоступна переменная i цикла for из блока кода try
int cv = 0;
try
{
for (int i = min; i <= max; i++)
{
// Чекаю прокси.
cv = i;
WebProxy proxy = new WebProxy(ms[i], true);
HttpWebRequest req = HttpWebRequest.CreateHttp("https://www.google.com/");
req.Proxy = proxy;
req.Timeout = 2000;
var Response = (HttpWebResponse)req.GetResponse();
var RespString = new StreamReader(Response.GetResponseStream()).ReadToEnd();
Console.WriteLine(ms[cv] + " ВЕРНО!!!!!!");
}
}
// Ловлю исключение.
catch (System.Net.WebException)
{
Console.WriteLine(ms[cv] + " Неверно!");
}
}
}
static void Main()
{
List<string> list = new List<string>();
int min;
int max;
// Эта переменная, что внизу, отвечает за количество прокси на один поток.
int proxyon1thread;
// Кол-во потоков.
int nathreads = 10;
// Эта переменная используется в конструкции foreach внизу.
bool checkadd = false;
string writetoprox = null;
// Ссылка на файл, откуда берем прокси.
string file = File.ReadAllText(@"D:\Oblako\ConsoleApp1\ConsoleApp1\proxydoc.txt");
// Эту конструкцию использую для считывания прокси в коллекцию List, избегая пробелов, отступов и прочей шелухи.
foreach (char r in file)
{
if (r != ' ' & r != '\r' & r != '\n')
{
writetoprox += r;
checkadd = false;
}
else
{
if (checkadd == false)
{
list.Add(writetoprox);
}
checkadd = true;
writetoprox = null;
}
}
// Делаю переменную ссылки на массив типа string, а затем присваиваю ей коллекцию, которую с помощью метода ToArray я перевёл в массив.
string[] ms = list.ToArray();
proxyon1thread = ms.Length / nathreads;
// Делаю массив потоков.
Thread[] th = new Thread[10];
// Присваиваю значений тем переменным, которые я объяснил выше, а именно: min и max
min = 0;
max = 0;
int mt;
// В этом цикле for я добавляю в массив потоков лямбда-выражение, которое вмещает в себя метод Checker.
for (int i = 1; i <= nathreads; i++)
{
// В этой переменной мы получаем конечное значение, т.е то, до которого метод будет проверять.
mt = proxyon1thread * i;
// Если это мы добавляем первый поток, то ставим ему диапазон прокси, которые он должен проверить, по индексу от 0 до значения перменной proxyon1thread
if (i == 0)
{
th[i - 1] = new Thread(() => Checker(ms, 0, proxyon1thread));
// Запоминаем в переменной индекс прокси, до которой мы проверили.
mincoun = proxyon1thread;
}
else
{
// Добавляем поток, где от значений переменной mincoun до значения переменной mt ( mt отображет тот диапазон, до которого метод должен проверить ) метод проверяет прокси.
th[i - 1] = new Thread(() => Checker(ms, mincoun, mt));
// Запоминаем то значение, которое было конечным, т.е то, до которого мы проверили.
mincoun = mt;
}
}
// Запускаем потоки в этом цикле.
for (int i = 0; i < th.Length; i++)
{
th[i].Start();
}
}