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

Как решить проблему с ListBox в C#?

У меня такая проблема. Программа определяет, доступен ли данный IP-адрес, если он доступен, то в ListBox-е создается запись с соотв. айпишником. Делаю так:
Ping pingSender = new Ping();
IPAddress address;
String str;
PingReply reply;
str = textBox1.Text + "." + textBox2.Text + "." + textBox3.Text + "." + textBox4.Text;
IPAddress.TryParse(str, out address);
reply = pingSender.Send(address);
if (reply.Status == IPStatus.Success)  listBox1.Items.Add(str);

С этим проблемы нет. Проблема возникает, когда проверяется диапазон адресов. По идее должно быть так: адрес проверен, если он доступен, то отображается в списке, и дальше проверяется след. адрес. Но все не так: доступные адреса отображаются только после проверки всех адресов. Бывает, ждешь пол минуты, только потом отображаются доступные адреса, а это не удобно. Как это можно исправить?
  • Вопрос задан
  • 2267 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
cjey
@cjey
Чтобы обработать события отрисовки windows в длинном цикле используйте Application.DoEvents().

for (int i = 0; i < 100; i++)
{
                listBox1.Items.Add(i);
                Application.DoEvents();
                System.Threading.Thread.Sleep(1000);
}
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Выносить цикл проверки в отдельный поток.
Ответ написан
Комментировать
Neuroware
@Neuroware
Программист в свободное от работы время
Rsa97 прав, но это не такая тривиальная задача для новичка (не новичек знает что такое потоки и не спрашивал бы)
можно сделать так весь код запихнуть в void DoScan()
далее в том месте где был код поставить Thread t = new Thread(DoScan);
t.Start();
но это не все, так будет ошибки при добавлении элемента в список, поэтому нужно заменить
if (reply.Status == IPStatus.Success)  listBox1.Items.Add(str);


на

BeginInvoke(new MethodInvoker(delegate
            {
               if (reply.Status == IPStatus.Success)  listBox1.Items.Add(str);
            }));


тогда проблем не будет, т.к. этот код будет выполняться в основном потоке.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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