C#使用多线程ping IP地址运行一段时间,出现界面假死。
代码太多,请移步csdn论坛http://bbs.csdn.net/topics/390368476使用的是多线程群pingIP,然后是一直ping在datagridvi...
代码太多,请移步csdn论坛 http://bbs.csdn.net/topics/390368476
使用的是多线程群ping IP,然后是一直ping在datagridview中显示各个IP的状态 展开
使用的是多线程群ping IP,然后是一直ping在datagridview中显示各个IP的状态 展开
3个回答
展开全部
原因可能出现在某一时刻创建的线程过多,Ping包的响应时间大于创建线程的时间(当前一组线程还没有执行完成,后一组线程已创建),当创建的线程达到饱和状态后,后续创建的线程都在等待执行中,占用系统的内存资源过多,导致界面反应不过来。
建议:不需要每次时间间隔都创建一组线程,只需要创建一组线程,每个线程固定Ping一个IP地址,可以使用Sleep来间隔多少时间Ping一次。然后将状态更新到显示界面,这样不会造成资源浪费。
建议:不需要每次时间间隔都创建一组线程,只需要创建一组线程,每个线程固定Ping一个IP地址,可以使用Sleep来间隔多少时间Ping一次。然后将状态更新到显示界面,这样不会造成资源浪费。
追问
怎么设置固定的线程去ping啊??
因为我用的是timer控件来控制一直ping的,,
追答
IP地址不是动态增加的吧(是动态增加的也没有关系,增加IP地址时肯定有一个动作,这时增加一个对应的线程即可)!初始界面时(如果不是自动开始Ping,则可以在功能事件中)为每个IP地址创建一个对应的副线程(声明一个全局的管理标识,如bool型,初始为true,当改变false时退回所有线程,在副线程中采用While循环),间隔多少秒(在循环中添加代码,如:Thread.Sleep(1000);间隔1秒Ping一次。)Ping一次,可以设置一个全局变量,可以动态更改间隔时间。
更新每个IP地址的状态最好是采用Table绑定的方式,在副线程中只需要更改Table中的值,界面就会自动刷新。
主要代码区域:
//管理标识。
private bool _bFlag=true;
//间隔Ping IP的时间。
private int _iMillisecond=2000;
while(this.bFlag)
{
//Ping IP的代码和接收响应的代码。
//修改对应IP地址的状态。
Thread.Sleep(_iMillisecond);//间隔时间,单位毫秒。
}
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
展开全部
用完记得释放ping 对象,或是象如下设置
using(Ping ping = new Ping())
{
....
}
或是显式调用Dispose,象下面这样 (ping as IDisposable).Dispose ()。注意Ping对象有一个bug,调用 Ping.Dispose()无法真正进行释放
还有每次Time触发时就创建一批线程的设计并不好,建议一次创建一批线程进行处理 ,类似如下:
while(needStrop)
{
uing( Ping ping = new Pint())
{
...
}
Thread.Sleep(700);
}
using(Ping ping = new Ping())
{
....
}
或是显式调用Dispose,象下面这样 (ping as IDisposable).Dispose ()。注意Ping对象有一个bug,调用 Ping.Dispose()无法真正进行释放
还有每次Time触发时就创建一批线程的设计并不好,建议一次创建一批线程进行处理 ,类似如下:
while(needStrop)
{
uing( Ping ping = new Pint())
{
...
}
Thread.Sleep(700);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不懂试试事实上事实上事实上事实上事实上事实上
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询