2012-11-01 7 views
4

그래서 600 개 이상의 장치가있는 사이트가 있습니다. 표준 .NET Ping 클래스를 사용하여 하나씩 모두 핑 (ping)하려고합니다. 어떤 이유로 든이 스레드가 충돌합니다. 단지 며칠 후에 응답하지 않습니다. 네트워크에서 Ping 장치 만 있으면됩니다. 우리는 Microsoft Windows Server 2008 R2를 사용하고 있습니다. .NET ping 클래스에 문제가 있습니까? 나는 또한 핑 소리 때문에 추측하고있는 메모리 누출을 경험 한 것 같다. 나는 Win32 ping dll을 써서 나를 위해 일을해야 할까? 아니면 .NET에서 뭔가 잘못하고있는 것일까?System.Net.NetworkInformation.Ping이 충돌 함

private void PingDevice(out bool state, string IP) 
{ 
    PingReply pingReply; 
    System.Net.NetworkInformation.Ping pingSender = null; 
    state = false; 
    try 
    { 
     pingSender = new System.Net.NetworkInformation.Ping(); 
     pingReply = pingSender.Send(IP, 4000); 
     state = (pingReply.Status == IPStatus.Success); // comms is on/off 
    } 
    catch (Exception ex) 
    { 
     PingGlobals.driverThread.LogIt("$E Pinging Devices:" + ex.Message + ", " + IP); 
    } 
    finally 
    { 
     if (pingSender != null) 
     { 
      ((IDisposable)pingSender).Dispose(); 
     } 
    } 
} 

답변

2

Ping의 비동기 버전을 사용할 때 Ping이 반환되지 않는 경우가 종종 있습니다. 싱크대에서 비동기가 발생하면 그냥 멈추게 될 것입니다. 비동기에 대한 대답은 Ping 제한 시간보다 긴 시간 제한을 설정 한 다음 SendAsync가 다시 시도하기 전에 SendAsyncCancel을 호출하는 것입니다.

1

System.Net.NetworkInformation.Ping 클래스의 새 인스턴스를 만들면 Server 2008에서 메모리가 누수되는 것 같습니다. 하나 또는 수백 개의 인스턴스를 유지하고 다시 사용하면 문제가 사라집니다. 그냥 매우 여러 스레드에서 액세스 조심하십시오.

0

이것은 .Net 버전 3.5 이하에서보고 된 문제입니다.
문제점과 해결책을 설명하는 Microsoft 문서가 here 있습니다.