C# ping 类的内存泄露问题
代码如下:
public class MyPing : Ping
{
    public void PingCompletedCallBack(object sender, PingCompletedEventArgs e) 
    {        
        using (sender as Ping) 
       {        
           if (e.Reply.Status == IPStatus.Success)   
           {        
               Console.WriteLine("Address: {0}", e.Reply.Address.ToString());   
           }      
        }
        (sender as IDisposable).Dispose();   
     }
}   
class Program  
{      
  static void Main(string[] args)   
  {        
    string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";   
    byte[] buffer = Encoding.ASCII.GetBytes(data);   
    int timeout = 1000;      
    for (int j = 0; j< 1000; j++)   
    {           
       for (int i = 0; i < 1000; i++)    
       {               
          MyPing pingSender = new MyPing();    
          try           
          {
              pingSender.PingCompleted += new PingCompletedEventHandler(pingSender.PingCompletedCallBack);
              pingSender.SendAsync(args[0], timeout, buffer, null); 
          }        
          catch ( Exception )              
          {                     
              ((IDisposable)pingSender).Dispose();         
          }          
       }         
    }        
  }  
}
运行的系统为win7
现象是内存不断增长,最后出现内存耗尽,出现异常。
以下的这个帖子我已经看过,就是按照上面的说法使用了using 语句,可是问题依旧。
http://www.cnblogs.com/Gildor/archive/2009/09/08/1562225.html?login=1#commentform
在资源管理器中看多句柄数不断增长,可能还是内部有非托管资源没有回收导致的。
谁还有解决办法?
------解决方案--------------------我能怎么说你呢?这哪里是内存泄漏啊,这其实是你并发开太多造成的。SendAsync是异步执行的方法,你一个100万次的循环里,一瞬间开了100万个并发操作,系统资源能足够吗?
------解决方案--------------------
pingSender.SendAsync是异步调用托管线程池线程来执行的,当可用线程用完时,将排队。
对于LZ千万级的实例,系统除了每个线程都要进入Ping等待返回,另一方面还需要维护这个队列,也许CPU占用并不会太高,但是系统能使用的TCP连接/半连接数是有限的,远远小于并发线程数
自己想想吧
------解决方案--------------------