2015-01-30 6 views
0

Я делаю программу для проверки состояния серверов своей компании. Мои сервера инфор загрузят в DgvServer я использую цикл для проверки состояния серверов:MultiThread on For Loop C#

private void btnCheck_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      string ip = ""; 
      Ping ping = new System.Net.NetworkInformation.Ping(); 
      PingReply pingreplay = null; 
      for (int i = 0; i < dgvServer.Rows.Count; i++) 
      { 
       //Get IP address 
       ip = dgvServer.Rows[i].Cells[1].Value.ToString(); 
       pingreplay = ping.Send(ip,10000); 
       if (pingreplay.Status == IPStatus.Success) 
       { 
        //update status of server 
        dgvServer.Rows[i].Cells[4].Value = "Online"; 
       } 
       else 
        //Update status of server 
        dgvServer.Rows[i].Cells[4].Value = "Offline"; 
      } 
     } 
     catch(Exception ex) 
      { 
       MessageBox.show(ex.Message); 
      } 
    } 

Это нормально, если все сервера в сети, но если какой-то сервер в автономном режиме, этот код взять на долгие времена, чтобы закончить. Поэтому я хочу использовать один поток для каждого цикла для проверки статуса каждого сервера. Я не использую параллель, потому что это программы .net 2.0. Пожалуйста, дайте мне совет по улучшению этого кода с помощью потока. Большое спасибо!

ответ

0

Вот отличная реализация Parallel.For, которая работает с .NET 2,0

В этой статье мы рассмотрим способ реализации статического метода для в C# 2.0 с таким же поведением.

https://dotnetgalactics.wordpress.com/2009/11/19/how-to-provide-a-parallel-for-loop-in-c2-0-2/

Вы можете использовать цикл Parallel.For, используя метод, предусмотренный в статье, опрашивать все серверы параллельно.

Обратите внимание, что это все равно будет блокировать пользовательский интерфейс до тех пор, пока выполняется самая длинная проверка одного сервера.

Еще один вопрос, который следует рассмотреть, заключается в том, чтобы поместить этот блок кода в BackgroundWorker, чтобы пользовательский интерфейс не был заблокирован.

Класс BackgroundWorker позволяет запускать операцию в отдельном выделенном потоке. Длительные операции, такие как загрузки и транзакции базы данных, могут привести к тому, что пользовательский интерфейс (UI) выглядит так, как будто он перестает отвечать на запросы во время работы. Когда вам нужен гибкий пользовательский интерфейс, и вы столкнулись с большими задержками, связанными с такими операциями, класс BackgroundWorker обеспечивает удобное решение.

Вы можете создать один BackgroundWorker на сервер обновления, что позволяет состояние каждого сервера для обновления в сетке, как только ответ приходит, или вы можете просто создать один BackgroundWorker (который, возможно, использует реализацию Parallel.For выше).