感觉你用的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;
        }
      

解决方案 »

  1.   


    是我的线程问题,,还是需要给form1设置线程,,求代码指导
      

  2.   

    把方法丢到多线程里面去task t=task .factory.startnew(()=>{//你的方法
    });
      

  3.   

    并且注意,添加 Thread.sleep(50);让大家都空点时间出来,不要老占着cpu
      

  4.   

    你还是建个静态的变量存储ping的结果吧,然后通过另一个线程每1秒(或0.5秒)轮询这个全局变量,更新到界面上。你的卡界面是因为你每个线程都在对界面控制直接操作,你计算下你点击的次数和触发器执行的间隔,每秒有多少次界面的刷新?有必要那么频繁刷新界面吗?我们肉眼能分辨的刷新率是多少?
      

  5.   

    我现在想到的可能就是每次循环都是新建出线程来去ping,,但是也不知道怎么解决。。
    你说的这个怎么做的啊
      

  6.   

    比如说700毫秒内“群p”买没有完毕,那么你这时候是不是就重复有2套群p?以此类推,很快地,机器上就有成百上千个“群p”,而且以指数速度增多。同一时间只需要有一个“群p”就够了,弄这些多余的“群p”干什么?在你的hexing_time_Tick中第一行,应该首先调用 hexing_time.Stop() 关闭它。然后“群p”真正全完毕之后才需要再启用定时器。使用定时器时要注意,很多人都弄出了这种“指数堆积任务垃圾”的bug出来。
      

  7.   

    我尝试了下,首先把hexing_time设置为true的状态,
    在hexing_time_Tick中放入hexing_time.stop();
    然后在hexing_ping中最后加入hexing_time.start();
    但是还是不行。就只会ping一次,然后就不会ping了
      

  8.   

    是不是我的timer用法错误啊,,,我想的意思就是  一直循环ping   这个timer我刚刚看了下,这个好像是计时器interval这个属性是:设置事件处理的频率,,,那这个意思不就是我设置1s的话,那它就每隔1s就触发一次,,,那怎么定时启动?我用timer.start()好像启动不了
      

  9.   

    我参照下网上的说法       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();
            }
      

  10.   

    确实说到点子上了。
    按照你这么速度累计,一段时间你的程序就会消耗完资源卡死了。
    你每700毫秒应该是发送一个ping包吧。
    下次再发送应该判断上一次的执行是否完成。如果没完成的话再发送ping就会出现累积的情况了。
      

  11.   

    hexing_time_Tick这个定时器,会阻断当前线程的。