Задать вопрос

Почему программа глючит и закрывается?

Есть данный код. Перебираются данные из textBox (которые находятся в виде id:auth) и отправляется запрос
У меня в textBox около 9000 строк. Почему то на 80 - 120 строчках программа зависает и уходит в даун. Как можно ускорить код и сберечь программу от вылетов.

private void button1_Click(object sender, EventArgs e)
        {
                System.Threading.Thread myThread = new System.Threading.Thread(ProcessedF);
                myThread.Start();
            }
        }
          void ProcessedF()
        {
            int lineCount = textBox1.Lines.Length;
            for (int i = 0; i < lineCount; i++)
            {

                string random_item = "109.234.155.197";
                BeginInvoke(new MethodInvoker(() => label1.Text = (Convert.ToInt32(label1.Text) + 1).ToString()));
                string str = textBox1.Lines[i].ToString();
                string [] split = str.Split(new Char [] {':'});
                string id = split[0];
                string auth = split[1];
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://" + random_item + "/prison/universal.php?name=vk.com/mobileprison&method=renamehouse&key=" + auth + "&user=" + id);
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                StreamReader myStreamReader = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));
                string text_check = myStreamReader.ReadToEnd();
                Thread.Sleep(100);

            }
  • Вопрос задан
  • 2853 просмотра
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
Kerman
@Kerman
Начнём с того, что 9000 строк в текстбоксе находиться не должны. Он тупо для этого не предназначен. Это нужно заливать в файл перед обработкой. А лучше читать в массив, уже преобразовав данные.
Во-вторых, это что за 3,14здец?
BeginInvoke(new MethodInvoker(() => label1.Text = (Convert.ToInt32(label1.Text) + 1).ToString()));

Нельзя было сделать локальную переменную с инкрементом внутри цикла и выводом в label? Или вообще выводить значение i в label1.Text (и offset от i задать, если надо).
Куда девается text_check, являющийся результатом всей этой непонятной конструкции?
Зачем ставить sleep(100), если конструкция подразумевает брутфорс по ip адресам, сгенерированным случайным образом?
И наконец, надо за собой закрывать открытые соединения, как уже сказал @maxaon.
Ответ написан
Комментировать
maxaon
@maxaon
Скорее всего, необходимо закрывать ресурс, после окончания работы с ним
myStreamReader.Close()
А лучше использовать конструкцию using
using (StreamReader myStreamReader = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251))) 
{
     //This allows you to do one Read operation.
     Console.WriteLine(sr.ReadToEnd());
}

Аналогично остальное проверьте (HttpWebResponse скорее всего тоже закрывать надо)
Ответ написан
impwx
@impwx
Разработчик
А встроенный отладчик Visual Studio вам что говорит? Все исключения можно отлавливать, чтобы точно узнать в каком месте оно возникло и почему. При зависании можно нажать на кнопку "Пауза", чтобы определить на какой строке программа забуксовала.
Ответ написан
ad1Dima
@ad1Dima
А ещё надо код выполняющихся в отдельном потоке оборачивать в try catch finally и обязательно закрывать ресурсы в finally.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы