2013-05-26 205 views
1

我遇到了一個非常簡單的程序,我正在做的麻煩。我希望這樣,當我點擊btnPing時,它會每1秒發送一次ping到google.com,並以毫秒爲單位返回ping。它完美的工作,直到我想循環的行動。在while循環之外,代碼可以工作,但每次我想發送ping命令時都需要點擊該按鈕。但是當我把代碼放到一個循環中時,它會凍結。我已經用for循環和while循環嘗試了它。該程序沒有返回任何錯誤。什麼讓我的程序凍結?while循環與Ping命令

Ping pingClass = new Ping(); 

private void btnPing_Click(object sender, EventArgs e) 
{ 
    while (true) 
    { 
     PingReply pingReply = pingClass.Send("google.com"); 
     rtxtPing.Text = rtxtPing.Text + "\r\n" + (pingReply.RoundtripTime.ToString() + "ms"); 
     System.Threading.Thread.Sleep(1000); 
    } 
} 
+0

除此之外,在風格上,我想看看調度呼叫ping 1秒定時器,而不是使用while/sleep循環。即使在後臺線程中,/睡眠也是一個不好的練習。 http://stackoverflow.com/questions/2822441/system-timers-timer-threading-timer-vs-thread-with-whileloop-thread-sleep-for – Alan

+0

@Alan我同意。另一種方法是在定時器上設置一個事件來執行ping操作,並讓按鈕只啓用定時器。 – mclaassen

回答

3

您正在UI線程上輸入一個無限循環。睡眠是一個阻塞呼叫,即它不會「釋放」線程繼續做其他工作。

下面是一個使用的解決方案事件:

 public delegate void PingReceivedEventHandler(int time); 

     public event PingReceivedEventHandler PingReceived; 

     public Form1() 
     { 
      InitializeComponent(); 

      PingReceived += new PingReceivedEventHandler(Form1_PingReceived); 
     } 

     void Form1_PingReceived(int time) 
     { 
      //do something with val 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      (new Thread(() => 
       { 
        while(true) 
        { 
         int time; 

         //get value here 

         PingReceived(time); 
        } 
       } 
      )).Start(); 
     } 
3

,就是因爲你的循環是阻塞的UI,這又不能自我更新,似乎被凍結(而實際上在程序執行在循環中ping)。您必須異步運行(即與UI代碼並行),在單獨的線程中運行。要開始,請參閱BackgroundWorker class提供的示例。

0

由於您的while循環以非停止方式執行,所以您在屏幕上看不到任何東西,感覺屏幕凍結了。您可以通過使用定時器而不是while循環來獲得期望的結果。我測試了這個代碼,它工作正常。

廣場按鈕單擊事件

private void button2_Click(object sender, EventArgs e) 
{   

    Timer timer = new Timer { Interval = 1000, Enabled = true }; 
    timer.Tick += new EventHandler(PingTest);    
} 

內將以下代碼添加方法與平邏輯如下

public void PingTest(object sender, EventArgs e) 
{ 
    Ping pingClass = new Ping(); 

    PingReply pingReply = pingClass.Send("google.com"); 
    rtxtPing.Text = rtxtPing.Text + "\r\n" + (pingReply.RoundtripTime.ToString() + "ms");   
} 
從下面的答案
+0

每次點擊時,他們都會啓動一個新的計時器 – mclaassen