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的状态
展开
 我来答
路有时不在脚下
推荐于2016-04-13 · 超过25用户采纳过TA的回答
知道答主
回答量:135
采纳率:0%
帮助的人:34.9万
展开全部
原因可能出现在某一时刻创建的线程过多,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);//间隔时间,单位毫秒。
}
哲事姓无
2013-02-17 · TA获得超过1176个赞
知道小有建树答主
回答量:903
采纳率:100%
帮助的人:431万
展开全部
用完记得释放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);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ak上校
2013-02-17
知道答主
回答量:44
采纳率:0%
帮助的人:5.7万
展开全部
不懂试试事实上事实上事实上事实上事实上事实上
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式