4

所以,我有一个拥有 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();
        }
    }
}
4

3 回答 3

2

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

于 2013-03-22T17:35:58.020 回答
1

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

于 2013-04-05T13:11:04.457 回答
1

这是针对低于 3.5 的 .Net 版本报告的问题这里
有一篇 Microsoft 文章描述了该问题及其解决方案。

于 2013-04-29T07:25:48.733 回答