2016-11-29 13 views
1

IPアドレスを50回pingしますが、開始をクリックするとプログラムがフリーズします。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スレッドを起動する]をクリックし、これは別のスレッドで(forループ)のpingプロセスを入れて、進行状況を示す画面

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 Lineでエラーが返される "クロススレッド操作が無効です: 'textBox2'コントロールは、作成されたスレッド以外の別のスレッドからアクセスされました。 – tyasird

+0

'Invoke'文を使って' textBox2.Text'を設定して、クロススレッド例外を取り除きます。メインスレッドで 'textBox2.Text = someString;'を実行します。 –

+1

次のようなものがあります: 'Invoke(new 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あなたはそのフィールドで作業する前にすべてのチェックをするつもりならOKですが、そうでなければヌル値などの例外を得ることができます –

+0

@ krw12572これは良い習慣ではありませんが動作します。したがって:D – Prajwal

関連する問題