读书人

C#一直ping IP地址出现界面卡死现象

发布时间: 2013-02-19 11:11:40 作者: rapoo

C#一直ping IP地址,出现界面卡死现象,求解决方案
先介绍下,菜鸟我做的一个程序是利用timer每700毫秒去群ping IP地址(一直ping),然后把状态放置在datagridview中显示出来,,现在出现的问题是,,但程序是在ping的次数为20次以下就不会出现界面卡死状态,但是一旦上了20就会卡了,整个界面缓慢(但是,datagridview中的数据还是能正常动态显示ping的状态)求大家帮我看看代码哪里搞错了。。。。

  
private void hexing_check_Click(object sender, EventArgs e)
{
hexing_date.Rows.Clear();

hexing_name_select();

hexing_time.Enabled = true;

}
private void hexing_time_Tick(object sender, EventArgs e)
{
z++;
hexing_time.Tick += new EventHandler(hexing_click_select);
}

public void hexing_name_select()
{
hexing_line hexing = new hexing_line();

for (int i = 0; i < hexing.hexing_name.Count(); i++)
{
hexing_date.Rows.Add();
hexing_date.Rows[i].Cells[0].Value = hexing.hexing_name[i];
hexing_date.Rows[i].Cells[1].Value = hexing.hexing_ip[i];
}


}
public void hexing_thread()
{
int line_count = hexing_date.RowCount;//统计datagridview有多少行,就在下面设置多个线程
Thread[] line_PING = new Thread[line_count];
for (int a = 0; a < line_count; a++)
{
line_PING[a] = new Thread(new ParameterizedThreadStart(hexing_ping));
line_PING[a].Start(a);
}
}

public void hexing_ping(object obj)
{

int i = Convert.ToInt32(obj);


Ping pp = new Ping();


PingReply ppResult = pp.Send(Convert.ToString(hexing_date.Rows[i].Cells[1].Value), 10);

hexing_date.Rows[i].Cells[2].Value = ppResult.RoundtripTime.ToString();
hexing_date.Rows[i].Cells[3].Value = ppResult.Status.ToString();
hexing_date.Rows[i].Cells[4].Value = z;
}
public void hexing_click_select(object source, EventArgs e)
{


if (z > 100)//这里设置20次就不会卡,但是20以上就会了。。。。
{
hexing_time.Enabled = false;
int click_all = z - 1;
MessageBox.Show(click_all.ToString());
z = 0;
click_all = 0;
}
else
{

hexing_thread();

}


}


[解决办法]
感觉你用的timer太多,试试看这个

  
private void hexing_check_Click(object sender, EventArgs e)
{
hexing_date.Rows.Clear();

hexing_name_select();

hexing_time.Enabled = true;

}
private void hexing_time_Tick(object sender, EventArgs e)
{
z++;

if (z > 100)//这里设置20次就不会卡,但是20以上就会了。。。。
{
hexing_time.Enabled = false;


int click_all = z - 1;
MessageBox.Show(click_all.ToString());
z = 0;
click_all = 0;
}
else
{
hexing_thread();
Application.DeEvents();
}

}

public void hexing_name_select()
{
hexing_line hexing = new hexing_line();

for (int i = 0; i < hexing.hexing_name.Count(); i++)
{
hexing_date.Rows.Add();
hexing_date.Rows[i].Cells[0].Value = hexing.hexing_name[i];
hexing_date.Rows[i].Cells[1].Value = hexing.hexing_ip[i];
}


}
public void hexing_thread()
{
int line_count = hexing_date.RowCount;//统计datagridview有多少行,就在下面设置多个线程
Thread[] line_PING = new Thread[line_count];
for (int a = 0; a < line_count; a++)
{
line_PING[a] = new Thread(new ParameterizedThreadStart(hexing_ping));
line_PING[a].Start(a);
}
}

public void hexing_ping(object obj)
{

int i = Convert.ToInt32(obj);
Ping pp = new Ping();


PingReply ppResult = pp.Send(Convert.ToString(hexing_date.Rows[i].Cells[1].Value), 10);



hexing_date.Rows[i].Cells[2].Value = ppResult.RoundtripTime.ToString();
hexing_date.Rows[i].Cells[3].Value = ppResult.Status.ToString();
hexing_date.Rows[i].Cells[4].Value = z;
}


[解决办法]
把方法丢到多线程里面去

task t=task .factory.startnew(()=>{

//你的方法
});
[解决办法]
你还是建个静态的变量存储ping的结果吧,然后通过另一个线程每1秒(或0.5秒)轮询这个全局变量,更新到界面上。你的卡界面是因为你每个线程都在对界面控制直接操作,你计算下你点击的次数和触发器执行的间隔,每秒有多少次界面的刷新?有必要那么频繁刷新界面吗?我们肉眼能分辨的刷新率是多少?
[解决办法]
比如说700毫秒内“群p”买没有完毕,那么你这时候是不是就重复有2套群p?以此类推,很快地,机器上就有成百上千个“群p”,而且以指数速度增多。

同一时间只需要有一个“群p”就够了,弄这些多余的“群p”干什么?

在你的hexing_time_Tick中第一行,应该首先调用 hexing_time.Stop() 关闭它。然后“群p”真正全完毕之后才需要再启用定时器。

使用定时器时要注意,很多人都弄出了这种“指数堆积任务垃圾”的bug出来。
[解决办法]
感觉里面的线程会很多哦,
试试就开一个线程,然后在里面循环处理。
定时器都可以放里面,
如果定时器放外面就传参数到线程中。
最后再委托回界面
[解决办法]

读书人网 >C#

热点推荐