Code Bye

win7下面没事在server 2008下就报错误

 using (Ping myPing = new Ping())
                        {
                            myPing.PingCompleted += new PingCompletedEventHandler(myPing_PingCompleted);
                            string pingIP = "192.168." + j.ToString() + "." + i.ToString();
                            myPing.SendAsync(pingIP, 1000, null);
                        }

win7下面没事在server 2008下就报错误 去掉using就没问题

解决方案

5

猜测如下
你的ping注册了事件,需要等待执行结束的回传,然后你用了异步的方式,那么异步结束后就到了using执行边界,然后你的ping就被dispose了,这时候事件callback就找不到myPing这个对象了,你可以试着将SendAsync改为Send看有没有问题,至于你说的win7没事,2008就有问题,就不知道了

5

你用的异步myPing.SendAsync(pingIP, 1000, null);
还敢放在using里?win7正常只不过侥幸罢了
异步方式一般都是在回调函数(事件)myPing_PingCompleted释放

10

一般来说,任何一个 .net framework 中的组件都会在 GC 时自动调用 Dispose 方法,原因是组件父类的 Dispose 方法中本身就是这样写的
        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }
        protected override void Finalize()
        {
            try
            {
                this.Dispose(false);
            }
            finally
            {
                base.Finalize();
            }
        }

所以不必要写using(){…}结构或不必要调用 Dispose方法时,不要画蛇添足去写。让 GC 执行的时候才去 Dispose,这样能保证应用程序性能,不至于在你应用正忙的时候去多余地进行 Dispose 操作。
有些地方必须写 using{ } 结构,或是直接调用 Dispose 方法,那是原因是你知道 Dispose 里边具体的代码主要干什么事情,你确实必须立刻调用它(而不是几秒钟之后调用它)。假如不知道 Dispose 里边具体干了什么,或你的问题跟本不是几秒钟之内不许调用 Dispose 方法的问题,那么就不要画蛇添足用本人的代码去调用 Dispose。

10

 using (Ping myPing = new Ping())
{
myPing.PingCompleted += new PingCompletedEventHandler(myPing_PingCompleted);
string pingIP = “192.168.” + j.ToString() + “.” + i.ToString();
myPing.SendAsync(pingIP, 1000, null);
}
这么用确实挺奇葩的。BUG肯定一堆。
using (Ping myPing = new Ping()) using之后的东西要释放。你确要在这个地方注册一个事件,这个事件啥时候触发呢,假如你ping失败了,要延迟好久,这时候你的using里面的东西都已经释放了,肯定报一堆问题。

10

假如你可以发debug版本,就能看到具体行数
否则可以把每一个调用拆成单个函数,这样也能查明问题
另外你可以把e.Error写进日志看看
就现在的条件,本人猜测可能是e.Reply为空,从Ping的代码看假如异步发送时出现异常,就会出现这个问题
http://referencesource.microsoft.com/System/R/43b3b2acd851482b.html

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明win7下面没事在server 2008下就报错误