Хорошо, мой совет - изучить ваши точки параллелизма.
Во-первых, вы столкнетесь с ошибкой при любом доступе к объектам оконных форм вне потока. т. е. ваш доступ к кнопке 1 будет вызывать MDA при отладке и может случайно произойти во время выполнения. Вы должны использовать делегат и вызывать метод обратно в главном потоке, используя такой шаблон:
this.Invoke(delgatetomyupdatermethod)
Во-вторых, ваше время тратится на сам пинг. Поэтому я бы рекомендовал написать список безопасных потоков (просто напишите метод с блокировкой
private object locker = new object();
private void InsertIntoList(string linebuffer)
{
lock(locker)
{
ipList.Rows.Add(linebuffer);
}
}
Я бы порекомендовал использовать пул потоков .Net для запуска вашего метода, вместо того чтобы пропинговать данный IP.
Для этого напишите функцию, которая примет IP-адрес для проверки связи и обновит список вашим результатом, а затем вызовите его, поставив в очередь элементы в пуле потоков. В самом деле, если вы передаете объект с ManualResetEvent, вы даже можете написать свой код, чтобы сказать
System.Threading.WaitHandle[] waits = new System.Threading.WaitHandle[255];
//initialise the list of these and create the objects to ping.
foreach (var obj in mylistofobjectvalues)
{
System.Threading.Threadpool.QueueUserWorkItem(method, obj);
}
System.Threading.WaitHandle.WaitAll(waits);
где method - метод ping, obj содержит объект с manualresetevent и информацию, необходимую вашему методу для пингования его цели.
Каждый раз, когда ваша ручка ожидания завершается, вы можете обновить свое состояние. Если приложить больше усилий к графическому интерфейсу, система может работать асинхронно, чтобы обновлять графический интерфейс при каждом ответе, а не только в конце.