C#一直ping IP地址,出现界面卡死现象,求解决方案

笨山猴 2013-02-16 11:07:38
先介绍下,菜鸟我做的一个程序是利用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();

}


}
...全文
3641 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
nongfuxu123 2014-11-11
  • 打赏
  • 举报
回复
正在学习多线程PINGing 学习了。
福大大笔记 2014-05-23
  • 打赏
  • 举报
回复
hexing_time_Tick这个定时器,会阻断当前线程的。
summer16md 2013-02-19
  • 打赏
  • 举报
回复
假死的情况 用多线程可以解决
myhope88 2013-02-19
  • 打赏
  • 举报
回复
没弄过,帮顶下
heycoder 2013-02-18
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
比如说700毫秒内“群p”买没有完毕,那么你这时候是不是就重复有2套群p?以此类推,很快地,机器上就有成百上千个“群p”,而且以指数速度增多。 同一时间只需要有一个“群p”就够了,弄这些多余的“群p”干什么? 在你的hexing_time_Tick中第一行,应该首先调用 hexing_time.Stop() 关闭它。然后“群p”真正全完毕之后才需要再启用定时器……
这个说的对。
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
比如说700毫秒内“群p”买没有完毕,那么你这时候是不是就重复有2套群p?以此类推,很快地,机器上就有成百上千个“群p”,而且以指数速度增多。 同一时间只需要有一个“群p”就够了,弄这些多余的“群p”干什么? 在你的hexing_time_Tick中第一行,应该首先调用 hexing_time.Stop() 关闭它。然后“群p”真正全完毕之后才需要再启用定时器……
确实说到点子上了。 按照你这么速度累计,一段时间你的程序就会消耗完资源卡死了。 你每700毫秒应该是发送一个ping包吧。 下次再发送应该判断上一次的执行是否完成。如果没完成的话再发送ping就会出现累积的情况了。
  • 打赏
  • 举报
回复
就算有2000个线程也跟lz这个问题没有关系。
yinghuigu 2013-02-17
  • 打赏
  • 举报
回复
感觉里面的线程会很多哦, 试试就开一个线程,然后在里面循环处理。 定时器都可以放里面, 如果定时器放外面就传参数到线程中。 最后再委托回界面
  • 打赏
  • 举报
回复
比如说700毫秒内“群p”买没有完毕,那么你这时候是不是就重复有2套群p?以此类推,很快地,机器上就有成百上千个“群p”,而且以指数速度增多。 同一时间只需要有一个“群p”就够了,弄这些多余的“群p”干什么? 在你的hexing_time_Tick中第一行,应该首先调用 hexing_time.Stop() 关闭它。然后“群p”真正全完毕之后才需要再启用定时器。 使用定时器时要注意,很多人都弄出了这种“指数堆积任务垃圾”的bug出来。
笨山猴 2013-02-17
  • 打赏
  • 举报
回复
引用 15 楼 oBenShanHou 的回复:
引用 11 楼 sp1234 的回复:比如说700毫秒内“群p”买没有完毕,那么你这时候是不是就重复有2套群p?以此类推,很快地,机器上就有成百上千个“群p”,而且以指数速度增多。 同一时间只需要有一个“群p”就够了,弄这些多余的“群p”干什么? 在你的hexing_time_Tick中第一行,应该首先调用 hexing_time.Stop() 关闭它。然后“……
我参照下网上的说法
       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;

            Thread th = new Thread(new ThreadStart(time_start));
            th.Start();
           // hexing_time.Stop();
          // hexing_time.Start();
        }

        private void time_start()
        {
            hexing_time.Start();
        }
笨山猴 2013-02-17
  • 打赏
  • 举报
回复
引用 14 楼 yoyo_573 的回复:
引用 11 楼 sp1234 的回复:比如说700毫秒内“群p”买没有完毕,那么你这时候是不是就重复有2套群p?以此类推,很快地,机器上就有成百上千个“群p”,而且以指数速度增多。 同一时间只需要有一个“群p”就够了,弄这些多余的“群p”干什么? 在你的hexing_time_Tick中第一行,应该首先调用 hexing_time.Stop() 关闭它。然后“……
是不是我的timer用法错误啊,,,我想的意思就是 一直循环ping 这个timer我刚刚看了下,这个好像是计时器interval这个属性是:设置事件处理的频率,,,那这个意思不就是我设置1s的话,那它就每隔1s就触发一次,,,那怎么定时启动?我用timer.start()好像启动不了。。。
笨山猴 2013-02-17
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
比如说700毫秒内“群p”买没有完毕,那么你这时候是不是就重复有2套群p?以此类推,很快地,机器上就有成百上千个“群p”,而且以指数速度增多。 同一时间只需要有一个“群p”就够了,弄这些多余的“群p”干什么? 在你的hexing_time_Tick中第一行,应该首先调用 hexing_time.Stop() 关闭它。然后“群p”真正全完毕之后才需要再启用定时器……
我尝试了下,首先把hexing_time设置为true的状态, 在hexing_time_Tick中放入hexing_time.stop(); 然后在hexing_ping中最后加入hexing_time.start(); 但是还是不行。。。。就只会ping一次,然后就不会ping了。。。
yoyo_573 2013-02-17
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
比如说700毫秒内“群p”买没有完毕,那么你这时候是不是就重复有2套群p?以此类推,很快地,机器上就有成百上千个“群p”,而且以指数速度增多。 同一时间只需要有一个“群p”就够了,弄这些多余的“群p”干什么? 在你的hexing_time_Tick中第一行,应该首先调用 hexing_time.Stop() 关闭它。然后“群p”真正全完毕之后才需要再启用定时器……
看来是老手了,
笨山猴 2013-02-16
  • 打赏
  • 举报
回复
引用 楼主 oBenShanHou 的回复:
先介绍下,菜鸟我做的一个程序是利用timer每700毫秒去群ping IP地址(一直ping),然后把状态放置在datagridview中显示出来,,现在出现的问题是,,但程序是在ping的次数为20次以下就不会出现界面卡死状态,但是一旦上了20就会卡了,整个界面缓慢(但是,datagridview中的数据还是能正常动态显示ping的状态)求大家帮我看看代码哪里搞错了。……
是我的线程问题,,还是需要给form1设置线程,,求代码指导
笨山猴 2013-02-16
  • 打赏
  • 举报
回复
引用 2 楼 gxingmin 的回复:
感觉你用的timer太多,试试看这个 C# code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 private void hexing……
还是不行,,不能吖。。
笨山猴 2013-02-16
  • 打赏
  • 举报
回复
引用 9 楼 qldsrx 的回复:
你还是建个静态的变量存储ping的结果吧,然后通过另一个线程每1秒(或0.5秒)轮询这个全局变量,更新到界面上。你的卡界面是因为你每个线程都在对界面控制直接操作,你计算下你点击的次数和触发器执行的间隔,每秒有多少次界面的刷新?有必要那么频繁刷新界面吗?我们肉眼能分辨的刷新率是多少?
我现在想到的可能就是每次循环都是新建出线程来去ping,,但是也不知道怎么解决。。。。。 你说的这个怎么做的啊
gxingmin 2013-02-16
  • 打赏
  • 举报
回复
感觉你用的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;
        }
      
铜臂阿铁木 2013-02-16
  • 打赏
  • 举报
回复
平均35毫秒一次ping
qldsrx 2013-02-16
  • 打赏
  • 举报
回复
你还是建个静态的变量存储ping的结果吧,然后通过另一个线程每1秒(或0.5秒)轮询这个全局变量,更新到界面上。你的卡界面是因为你每个线程都在对界面控制直接操作,你计算下你点击的次数和触发器执行的间隔,每秒有多少次界面的刷新?有必要那么频繁刷新界面吗?我们肉眼能分辨的刷新率是多少?
笨山猴 2013-02-16
  • 打赏
  • 举报
回复
引用 6 楼 pigg18 的回复:
把方法丢到多线程里面去 task t=task .factory.startnew(()=>{ //你的方法 });
能详细点是怎么搞么,放在我上面那里去啊 我没搞过这个。。。
加载更多回复(3)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧