Многопоточность с проверкой

#c# #multithreading #sockets

#c# #многопоточность #сокеты

Вопрос:

Я хотел написать программу, которая будет проверять прокси… Я хотел использовать многопоточность, но на самом деле не знаю, как применить это к моей программе:

 int ktory = 0;

// Button to start multithreading
private void p_check_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 10; i  )
    {
        Thread th = new Thread(test_proxy);
        CheckForIllegalCrossThreadCalls = false;
        th.Start();
    }

}

//This is my function to test proxies
private void test_proxy()
{
    try
    {

        int ile = p_listbox.Items.Count;

        string proxy = null;
        //'ktory' - means position in listbox
        proxy = p_listbox.Items[ktory].ToString();
        ktory  = 1;

        //Splitting on IP and PORT
        int gdzie = proxy.IndexOf(":");
        string IP = proxy.Remove(gdzie);
        string ipp = proxy.Replace(IP   ":", "");
        int PORT = Int32.Parse(ipp);
        //end o splitting

        //My testing of anonimty ( works good don`t need to check)
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(p_proxyjudge.Text);
        WebProxy adr_proxy = new WebProxy(IP, PORT);
        adr_proxy.UseDefaultCredentials = true;
        request.Proxy = adr_proxy;
        request.Timeout = 15000;

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream stream = response.GetResponseStream();

        // Checking if anonymous ( not important)
        StreamReader sr = new StreamReader(stream);
        while (sr.EndOfStream != true)
        {
            string checking = sr.ReadLine();
            if (!checking.Contains("REMOTE_ADDR ="))
                p_work.Items.Add(proxy);
        }

        sr.Close();
        stream.Close();
    }
    catch (Exception ex)
    {
        ktory  = 1;
    }
}
  

< Для кода: ile и ktory такие же, как i, или j как многочисленные переменные >

Но моя многопоточность останавливается на 10 первых прокси или просто проверяет их 10 раз как один…

Основная проблема заключается в том, чтобы заставить 10 ботов проверять прокси и после завершения проверки одного прокси переходить на другой в listbox (но все еще другие боты работают в фоновом режиме)

ПОЖАЛУЙСТА, ПОМОГИТЕ МНЕ 🙂 Я сижу над этим 2-й день и не могу разобраться

Комментарии:

1. CheckForIllegalCrossThreadCalls = false; … Вероятно, это не очень хорошая идея. Вы, вероятно, захотите посмотреть, как вы правильно получаете доступ к элементам управления из потока. Делегирование, вызов и т.д.

2. Вы создаете только 10 потоков для вызова этой функции, поэтому они будут выполняться только 10 раз. Кроме того, ktory = 1; не является потокобезопасным. Остальную часть кода не просматривал, но именно поэтому вы видите результаты, о которых вы упомянули.

3. Надеюсь, вы не используете их для рассылки спама

Ответ №1:

Вы не блокируете доступ к ktory , который изменяется несколькими потоками. Из-за этого нет гарантии, что ваши 10 потоков проверят 10 разных прокси.

 Object _lock = new Object();
int ktory=0;

...
private void test_proxy()
{
   try
   {
     int ile = p_listbox.Items.Count;

     string proxy = null;
     //'ktory' - means position in listbox
     lock (_lock) {
       proxy = p_listbox.Items[ktory].ToString();
       ktory  = 1;
     }
...
  

Комментарии:

1. 1. Кроме того, Interlocked.Increment здесь было бы полезно — msdn.microsoft.com/en-us/library/dd78zt0c.aspx