2015-01-30 5 views
0

회사 서버의 상태를 확인하는 프로그램을 만들고 있습니다. 내 서버 DgvServer I는 서버의 상태를 확인하는 루프에 사용 에로드됩니다 INFOR :For 루프의 MultiThread 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

이 링크를 참조하십시오 우리는 방법에 대한 정적을 구현하는 방법을 볼 수 있습니다이 문서에서는 .NET 2.0

작동 Parallel.For의 멋진 구현 동일한 동작을하는 C# 2.0에서.

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

당신은 병렬로 모든 서버를 폴링의 문서에서 제공하는 방법을 사용하는 Parallel.For 루프를 사용할 수 있습니다.

가장 긴 단일 서버 확인이 필요한 동안에는 UI를 계속 차단합니다.

또 다른 옵션은 해당 코드 블록을 BackgroundWorker에 넣음으로써 UI가 차단되지 않도록하는 것입니다.

BackgroundWorker 클래스를 사용하면 별도의 전용 스레드에서 작업을 실행할 수 있습니다. 다운로드 및 데이터베이스 트랜잭션과 같은 시간이 많이 소요되는 작업으로 인해 사용자 인터페이스 (UI)가 실행되는 동안 응답을 멈춘 것처럼 보일 수 있습니다. 반응 형 UI가 필요하고 그러한 작업과 관련된 긴 지연이 발생하면 BackgroundWorker 클래스가 편리한 솔루션을 제공합니다.

당신은 응답이 오면 각 서버의 상태가 빨리 그리드에 업데이트 할 수 있도록 업데이트 서버 당 하나 개의 경우 BackgroundWorker를 만들거나 그냥 아마도 Parallel.For 구현을 사용하는 단일 BackgroundWorker에를 (만들 수 있습니다

위).