问题描述
using(PingmyPing=newPing()){myPing.PingCompleted+=newPingCompletedEventHandler(myPing_PingCompleted);stringpingIP="192.168."+j.ToString()+"."+i.ToString();myPing.SendAsync(pingIP,1000,null);}
win7下面没事在server2008下就报错误去掉using就没问题
解决方案
解决方案二:
报什么错误呢?运行的程序是一样的程序吗?(不是仅指这一段代码)
解决方案三:
是一样的程序一样的代码只是有没有using
解决方案四:
引用1楼starfd的回复:
报什么错误呢?运行的程序是一样的程序吗?(不是仅指这一段代码)
**************异常文本**************System.NullReferenceException:未将对象引用设置到对象的实例。在PcIpAddress.Form1.myPing_PingCompleted(Objectsender,PingCompletedEventArgse)**************已加载的程序集**************
解决方案五:
猜测如下你的ping注册了事件,需要等待执行结束的回传,然后你用了异步的方式,那么异步结束后就到了using执行边界,然后你的ping就被dispose了,这时候事件callback就找不到myPing这个对象了,你可以试着将SendAsync改为Send看有没有问题,至于你说的win7没事,2008就有问题,就不知道了
解决方案六:
引用4楼starfd的回复:
猜测如下你的ping注册了事件,需要等待执行结束的回传,然后你用了异步的方式,那么异步结束后就到了using执行边界,然后你的ping就被dispose了,这时候事件callback就找不到myPing这个对象了,你可以试着将SendAsync改为Send看有没有问题,至于你说的win7没事,2008就有问题,就不知道了
我改成send也不行但是确实在win7上就行在server2008上就不行我很是奇怪
解决方案七:
大家还没上班吗??大神们给看看啊!!!!!!!!!!!!
解决方案八:
先把using去掉看看,应该是这个using释放导致的问题
解决方案九:
win7和08本身差别不大,检查下是不是这两台机子其他配置不同,有没有安全软件对网络通讯的拦截,防火墙什么的
解决方案十:
引用7楼starfd的回复:
先把using去掉看看,应该是这个using释放导致的问题
using去掉就没问题了啊在那上面都可以运行啊但是我的内存涨的厉害!!
解决方案十一:
你用的异步myPing.SendAsync(pingIP,1000,null);还敢放在using里?win7正常只不过侥幸罢了异步方式一般都是在回调函数(事件)myPing_PingCompleted释放
解决方案十二:
还好你没说using又出惊天bug
解决方案十三:
引用10楼dongxinxi的回复:
你用的异步myPing.SendAsync(pingIP,1000,null);还敢放在using里?win7正常只不过侥幸罢了异步方式一般都是在回调函数(事件)myPing_PingCompleted释放
关键是怎么释放啊这是主要的啊
解决方案十四:
引用12楼bjgzxx的回复:
Quote: 引用10楼dongxinxi的回复:
你用的异步myPing.SendAsync(pingIP,1000,null);还敢放在using里?win7正常只不过侥幸罢了异步方式一般都是在回调函数(事件)myPing_PingCompleted释放关键是怎么释放啊这是主要的啊
#10楼其实已经告诉你了。在myPing_PingCompleted中才能去调用Dispose()方法。
解决方案十五:
你其实要首先确定,你所谓的问题跟Dispose()方法真的相关吗?你又说你的内存“涨的厉害”是这个造成的,又说不这样根本就不能运行。说白了,你现在还根本不确定这是不是内存涨的原因,还仅仅只是在那里破坏式的猜测呢。引用9楼bjgzxx的回复:
Quote: 引用7楼starfd的回复:
先把using去掉看看,应该是这个using释放导致的问题using去掉就没问题了啊在那上面都可以运行啊但是我的内存涨的厉害!!
解决方案:
一般来说,任何一个.netframework中的组件都会在GC时自动调用Dispose方法,因为组件父类的Dispose方法中本身就是这样写的publicvoidDispose(){this.Dispose(true);GC.SuppressFinalize(this);}protectedoverridevoidFinalize(){try{this.Dispose(false);}finally{base.Finalize();}}
所以不必要写using(){...}结构或者不必要调用Dispose方法时,不要画蛇添足去写。让GC执行的时候才去Dispose,这样能保证应用程序性能,不至于在你应用正忙的时候去多余地进行Dispose操作。有些地方必须写using{}结构,或者是直接调用Dispose方法,那是因为你知道Dispose里边具体的代码主要干什么事情,你确实必须立刻调用它(而不是几秒钟之后调用它)。如果不知道Dispose里边具体干了什么,或者你的问题跟本不是几秒钟之内不许调用Dispose方法的问题,那么就不要画蛇添足用自己的代码去调用Dispose。
解决方案:
或者你的问题跟本不是几秒钟之内不许调用Dispose方法-->或者你的问题跟本不是几秒钟之内必须调用Dispose方法有些博客上以讹传讹,说什么“既然拿不准要不要调用Dispose,那么就干脆总是调用Dispose方法吧”。这是误导的。因为Dispose方法中就算是如果要释放非托管资源,绝不是对软件系统没有影响的。在.net框架中它本来就是设计为在软件系统比较空闲时才启动GC,而GC运行时才去调用Dispose(false)。而假设你的Dispose中要是放什么托管资源,这更是用不着你去操心的,因为托管资源在GC时会自动如雪崩一样去关联着同时被释放,用不着你特意写代码去释放。如果你遇到所谓“内存”的问题,首先要掌握第一手证据,分析是不是你的几十个所谓的Ping对象就造成了你的问题。我手机上的微信占用了150M内存空间,QQ占用了180M空间。或许你遇到的问题根本就不是问题。手机软件尚且如此,而有些人却对pc机上.net应用程序占用20M内存就开骂了,这样的人就变成了专门来是黑微软、黑.net的人。
解决方案:
引用16楼sp1234_maJia的回复:
或者你的问题跟本不是几秒钟之内不许调用Dispose方法-->或者你的问题跟本不是几秒钟之内必须调用Dispose方法有些博客上以讹传讹,说什么“既然拿不准要不要调用Dispose,那么就干脆总是调用Dispose方法吧”。这是误导的。因为Dispose方法中就算是如果要释放非托管资源,绝不是对软件系统没有影响的。在.net框架中它本来就是设计为在软件系统比较空闲时才启动GC,而GC运行时才去调用Dispose(false)。而假设你的Dispose中要是放什么托管资源,这更是用不着你去操心的,因为托管资源在GC时会自动如雪崩一样去关联着同时被释放,用不着你特意写代码去释放。如果你遇到所谓“内存”的问题,首先要掌握第一手证据,分析是不是你的几十个所谓的Ping对象就造成了你的问题。我手机上的微信占用了150M内存空间,QQ占用了180M空间。或许你遇到的问题根本就不是问题。手机软件尚且如此,而有些人却对pc机上.net应用程序占用20M内存就开骂了,这样的人就变成了专门来是黑微软、黑.net的人。
你说的我明白第一点:如果我不加using运行起来没有问题只是你运行一遍我的代码内存就会增加一直增加不会释放一直到死机第二点:加using那么在64win7上没问题在,在server2008上就出我贴的错误信息我就是不明白为什么出这个错误第三点:加using在64win7内存会自动释放不管运行多少遍总会保持在一个合理水平!!!!!!
解决方案:
都安装了.net环境3.5和4.0的
解决方案:
我来膜拜大神的
解决方案:
using(PingmyPing=newPing()){myPing.PingCompleted+=newPingCompletedEventHandler(myPing_PingCompleted);stringpingIP="192.168."+j.ToString()+"."+i.ToString();myPing.SendAsync(pingIP,1000,null);}这么用确实挺奇葩的。BUG肯定一堆。using(PingmyPing=newPing())using之后的东西要释放。你确要在这个地方注册一个事件,这个事件啥时候触发呢,如果你ping失败了,要延迟好久,这时候你的using里面的东西都已经释放了,肯定报一堆问题。
解决方案:
引用20楼zanfeng的回复:
using(PingmyPing=newPing()){myPing.PingCompleted+=newPingCompletedEventHandler(myPing_PingCompleted);stringpingIP="192.168."+j.ToString()+"."+i.ToString();myPing.SendAsync(pingIP,1000,null);}这么用确实挺奇葩的。BUG肯定一堆。using(PingmyPing=newPing())using之后的东西要释放。你确要在这个地方注册一个事件,这个事件啥时候触发呢,如果你ping失败了,要延迟好久,这时候你的using里面的东西都已经释放了,肯定报一堆问题。
你说的没错但是我用win7不报错并且运行的很好
解决方案:
顶一个周末没人啊!!!!!!!!!
解决方案:
解决方案:
再顶下快过年了真冷清
解决方案:
你确认过在win7上complete都执行了吗?
解决方案:
引用3楼bjgzxx的回复:
Quote: 引用1楼starfd的回复:
报什么错误呢?运行的程序是一样的程序吗?(不是仅指这一段代码)**************异常文本**************System.NullReferenceException:未将对象引用设置到对象的实例。在PcIpAddress.Form1.myPing_PingCompleted(Objectsender,PingCompletedEventArgse)**************已加载的程序集**************
擦,忽略了一个事实,这个NullReferenceException是发生在回调里的。。。。你都没debug过是哪个变量的问题吗?
解决方案:
引用25楼shingoscar的回复:
你确认过在win7上complete都执行了吗?
我非常确认在win7上没事我在win7上做的winserver上没开发环境不能调试
解决方案:
我也非常肯定的肯定是这段代码出的问题因为只要去掉using在winserver上就没事
解决方案:
看了半天,感觉都还在猜。代码再贴多一点。你说不用using内存爆,不知道是不是这个+=被执行了多次?还是说出了局部方法就释放了myPing.PingCompleted+=newPingCompletedEventHandler(myPing_PingCompleted);
解决方案:
引用29楼u013421223的回复:
看了半天,感觉都还在猜。代码再贴多一点。你说不用using内存爆,不知道是不是这个+=被执行了多次?还是说出了局部方法就释放了myPing.PingCompleted+=newPingCompletedEventHandler(myPing_PingCompleted);
privatevoidmyPing_PingCompleted(objectsender,PingCompletedEventArgse){//StringBuildersb=newStringBuilder();if(e.Reply.Status==IPStatus.Success){if(e.Reply.Address.ToString().Trim()!=""){this.listBoxAddrs.Items.Add(e.Reply.Address.ToString());//stringmac=GetMacAddress(e.Reply.Address.ToString());//sb.Append(""+mac);num++;}}//this.txtAddrs.Text+=sb.ToString();this.lbIPs.Text="在线IP数:"+num.ToString();}
解决方案:
请多指教谢谢
解决方案:
引用28楼bjgzxx的回复:
我也非常肯定的肯定是这段代码出的问题因为只要去掉using在winserver上就没事
堆栈已经很明显了,是myPing_PingCompleted写的有问题你可以贴出来看看还是你觉得你所谓的经验比调试信息更加靠谱?
解决方案:
引用32楼shingoscar的回复:
Quote: 引用28楼bjgzxx的回复:
我也非常肯定的肯定是这段代码出的问题因为只要去掉using在winserver上就没事堆栈已经很明显了,是myPing_PingCompleted写的有问题你可以贴出来看看还是你觉得你所谓的经验比调试信息更加靠谱?
不是我经验靠谱不靠谱的是我没有winserver的开发环境我不能在server的环境下调试还是请大神帮忙!!!
解决方案:
问题应该是出在myPing_PingCompleted里面,当你异步执行回来触发这个事件的时候e对象应该是已经被释放了,所以报null引用。目测是这样,未经过测试
解决方案:
如果你可以发debug版本,就能看到具体行数否则可以把每一个调用拆成单个函数,这样也能查明问题另外你可以把e.Error写进日志看看就现在的条件,我猜测可能是e.Reply为空,从Ping的代码看如果异步发送时出现异常,就会出现这个问题