遇到了一个奇怪的“问题”。有一个可以对整个网络进行 ping 扫描的应用程序。在您进入具有 255.255.0.0 网络掩码(即 65k + 地址)的网络之前效果很好。
我这样发送我的 ping:
foreach (string str in ListContainingAddresses)
{
using (Ping ping = new Ping())
{
if (pingCounter == 10000) { Thread.Sleep(10000); pingCounter = 0; }
//Make an eventhandler
ping.PingCompleted += new PingCompletedEventHandler(pingCompleted);
//Send the pings asynchronously
ping.SendAsync(IPAddress.Parse(str), 1000);
sentPings++;
//This counts pings being sent out
pingCounter++;
}
}
并像这样接收它们:
public void pingCompleted(object sender, PingCompletedEventArgs e)
{
//This counts recieved addresses
recievedIpAddresses++;
if (e.Reply.Status == IPStatus.Success)
{
//Do something
}
else
{
/*Computer is down*/
}
//This checks if sent equals recieved
if (recievedIpAddresses == sentPings )
{
//All returned
}
}
问题是 a) 有时(很少)它没有完成(条件不满足)。b) 当它完成时,数字不匹配?如果我刚刚打印发送和接收,它们是
Sent: 65025 Recieved: 64990
尽管如此,满足条件并且应用程序继续进行?我不知道为什么以及如何发生这种情况。应用程序更新两个整数的代码是否执行得很快?是否有一些 ping 在途中丢失?如果我在具有 255 个地址的子网络上尝试它,则永远不会发生此问题。自 .NET 3.5 以来,不能使用 CountDownEvent 而不是变量