System.Net.NetworkInformation.Ping崩溃

所以,我有一个拥有600多台设备的网站。 我正在尝试使用标准的.NET ping类逐个ping它们。 由于某种原因,这个线程崩溃了 – 几天后它就停止响应了。 它只是在网络上ping设备。 我们正在使用Microsoft Windows Server 2008 R2。 .NET ping类有什么问题吗? 我似乎也遇到了内存泄漏,我猜测是由于ping。 我应该写一个win32 ping dll为我做这个工作还是我做错了.NET?

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(); } } } 

在使用Ping的异步版本时,我发现有时Ping永远不会返回。 我可以想象,如果在Async上发生这种情况,在同步时,它就会失速。 我找到的Async的答案是设置超时(超过Ping超时),然后在SendAsync重试之前调用SendAsyncCancel。

创建System.Net.NetworkInformation.Ping类的新实例似乎泄漏了Server 2008上的内存。如果您保留一个(或一百个)实例并重用它们,那么问题就会消失。 只是要小心从多个线程访问它。

这是针对3.5以下的.Net版本报告的问题
有一篇微软文章描述了这个问题及其解决方案。