using (Ping myPing = new Ping()) { myPing.PingCompleted += new PingCompletedEventHandler(myPing_PingCompleted); string pingIP = "192.168." + j.ToString() + "." + i.ToString(); myPing.SendAsync(pingIP, 1000, null); }
解决方案
5
猜测如下
你的ping注册了事件,需要等待执行结束的回传,然后你用了异步的方式,那么异步结束后就到了using执行边界,然后你的ping就被dispose了,这时候事件callback就找不到myPing这个对象了,你可以试着将SendAsync改为Send看有没有问题,至于你说的win7没事,2008就有问题,就不知道了
你的ping注册了事件,需要等待执行结束的回传,然后你用了异步的方式,那么异步结束后就到了using执行边界,然后你的ping就被dispose了,这时候事件callback就找不到myPing这个对象了,你可以试着将SendAsync改为Send看有没有问题,至于你说的win7没事,2008就有问题,就不知道了
5
你用的异步myPing.SendAsync(pingIP, 1000, null);
还敢放在using里?win7正常只不过侥幸罢了
异步方式一般都是在回调函数(事件)myPing_PingCompleted释放
还敢放在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里面的东西都已经释放了,肯定报一堆问题。
{
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
否则可以把每一个调用拆成单个函数,这样也能查明问题
另外你可以把e.Error写进日志看看
就现在的条件,本人猜测可能是e.Reply为空,从Ping的代码看假如异步发送时出现异常,就会出现这个问题
http://referencesource.microsoft.com/System/R/43b3b2acd851482b.html