2016-11-29 176 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