2016-11-29 134 views
1

我ping 50个IP地址,但当我点击开始时程序冻结。形式冻结for循环

我该怎么做,而不结冰。

private void button1_Click(object sender, EventArgs e) 
{ 
    string IP = textBox1.Text; 
    string[] IPBlocks = IP.Split('.'); 
    for (int x = 0; x < 50; x++) 
    { 
     System.Threading.Thread.Sleep(50); 
     int IPLastBlock = Int32.Parse(IPBlocks[3]) + (x+1); 
     IP = IPBlocks[0]+"."+ IPBlocks[1]+"."+ IPBlocks[2]+"."+ IPLastBlock; 
     bool pingStatus = PingHost(IP); 
     textBox2.Text += String.Format("{0} => {1} \r\n", IP, pingStatus); 
    } 
} 
+0

把平进程(循环)在单独的线程,并取得进展直到线程处理完成。 –

+1

您不能在事件处理程序中执行冗长的任务,这会阻塞UI线程并阻止UI更新。您需要创建一个新线程来完成您的处理。请参阅http://stackoverflow.com/questions/28194943/creating-and-starting-a-task-on-the-ui-thread和http://stackoverflow.com/questions/661561/how-to-update-the -gui-from-another-thread-in-c –

回答

3

在单击按钮启动一个separte线程,这不会挂在你的屏幕

private void button1_Click(object sender, EventArgs e) 
    { 
     Thread newThread= new Thread(PingIP); 
     newThread.Start(); 
    } 

    private void PingIP() 
    { 
     string IP = textBox1.Text; 
     string[] IPBlocks = IP.Split('.'); 
     for (int x = 0; x < 50; x++) 
     { 
      System.Threading.Thread.Sleep(50); 
      int IPLastBlock = Int32.Parse(IPBlocks[3]) + (x+1); 
      IP = IPBlocks[0]+"."+ IPBlocks[1]+"."+ IPBlocks[2]+"."+ IPLastBlock; 
      bool pingStatus = PingHost(IP); 
      textBox2.Text += String.Format("{0} => {1} \r\n", IP, pingStatus); 
     } 
    } 
+1

在textBox2.Text中返回错误行“跨线程操作无效:'textBox2'控件是从另一个线程访问的,而该线程不是构建的线程。 – tyasird

+0

使用'Invoke'语句来设置'textBox2.Text'来摆脱交叉线程异常。它会在主线程上执行'textBox2.Text = someString;'。 –

+1

是这样的:'调用(新MethodInvoker(()=> {textBox2.Text + =的String.Format( “{0} => {1} \ r \ n” 个,IP,pingStatus);}));' –

1

使用ThreadPool.QueueUserWorkItem

ThreadPool.QueueUserWorkItem(delegate { 
    bool pingStatus = PingHost(IP); 
    textBox2.Text += String.Format("{0} => {1} \r\n", IP, pingStatus); 
}); 
+2

从另一个线程访问'textBox2.Text'是否是件好事? –

+0

@ krw12572如果你打算在该领域工作之前进行所有检查,那么可以,但是如果没有,你可以得到空值等异常。 –

+0

@ krw12572这不是一个好的做法,但是可行。所以:D – Prajwal