2014-07-15 133 views
0

我寫了這個程序來自動收集允許我連接到端口8888的IP地址。計時器不會停止

它工作正常,直到最後一個循環。我的for循環完成。但我的計時器繼續和輸出:

10.10.10.150 - No 
10.10.10.150 - No 
10.10.10.150 - No 
10.10.10.150 - No 

這是我的代碼,在for循環後,我試着停止計時器,但它不停止。

protected void PingPython(){ 

    for (int i = 50; i <= 150; i++){ 

     // Try Connect to Python 
     try{ 
      ip = "10.10.10."+i.ToString(); 

      // Set timer to break Client connection 
      tConnectTimeout = new System.Timers.Timer(100); 
      tConnectTimeout.Elapsed += new System.Timers.ElapsedEventHandler(tConnectTimeout_Elapsed); 
      tConnectTimeout.Start(); 

      // Connect to Client 
      cli = new TcpClient(); 
      cli.Connect(ip, 8888); 

      // If it connects, stop the thread 
      tConnectTimeout.Stop(); 
      tConnectTimeout.Dispose(); 
      Console.WriteLine(ip + " - Yes"); 
      ipAddresses.Add(ip); 
      cli.Close(); 

     } catch (ObjectDisposedException ex) { 
     } catch (SocketException ex) { 
      tConnectTimeout.Stop(); 
      tConnectTimeout.Dispose(); 
      Console.WriteLine(ip + " - No"); 
     } 

    } 

    tConnectTimeout.Stop(); 
    btnStart.Sensitive = true; 
    foreach(string ipa in ipAddresses){ 
     cbAddresses.AppendText(ipa); 
    } 
    cbAddresses.Sensitive = true; 
} 

public void tConnectTimeout_Elapsed(object sender, System.Timers.ElapsedEventArgs e){ 
    //Close the socket 
    cli.Close(); 
    Console.WriteLine(ip + " - No"); 

    //Stop and dispose timer 
    tConnectTimeout.Stop(); 
    tConnectTimeout.Dispose(); 
} 
+0

請添加一個答案,顯示問題的答案,而不是重新編輯問題。謝謝 –

+1

你真的只是想實現連接超時? http://stackoverflow.com/a/17118710/56778爲更乾淨的方式來做到這一點。 –

回答

2

嘗試使用using語句來創建計時器(和它的配置無論EXCETION)

using (var timer = new system.timer) 
{ 




} 

,而不是使用異常處理程序來做到這一點。 爲什麼圍繞巨大範圍的空異常處理程序?這是不好的,你想刪除或範圍儘可能最小..

發生什麼事情是有些東西正在爆炸,導致您的for循環退出生效之前定時器可以停止,因此它不斷髮射事件。

響應於喬恩Edgerton的溶液shuold是

protected void PingPython(){ 

for (int i = 50; i <= 150; i++){ 

    // Try Connect to Python 
    try{ 
     ip = "10.10.10."+i.ToString(); 

     // Set timer to break Client connection 
     tConnectTimeout = new System.Timers.Timer(100); 
     tConnectTimeout.Elapsed += new System.Timers.ElapsedEventHandler(tConnectTimeout_Elapsed); 
     tConnectTimeout.Start(); 

     // Connect to Client 
     cli = new TcpClient(); 
     cli.Connect(ip, 8888); 


     Console.WriteLine(ip + " - Yes"); 
     ipAddresses.Add(ip); 
     cli.Close(); 

    } catch (ObjectDisposedException ex) { 
    } catch (SocketException ex) { 
     Console.WriteLine(ip + " - No"); 
    } 
    finally 
    { 
     tConnectTimeout.Stop(); 
     tConnectTimeout.Dispose(); 
    } 

} 

tConnectTimeout.Stop(); 
btnStart.Sensitive = true; 
foreach(string ipa in ipAddresses){ 
    cbAddresses.AppendText(ipa); 
} 
cbAddresses.Sensitive = true; 

}

或更好

for (int i = 50; i <= 150; i++) 
{ 

    // Try Connect to Python 
    try 
    { 
     ip = "10.10.10."+i.ToString(); 

     // Set timer to break Client connection 
     using(tConnectTimeout = new System.Timers.Timer(100)) 
     { 
      tConnectTimeout.Elapsed += new System.Timers.ElapsedEventHandler(tConnectTimeout_Elapsed); 
      tConnectTimeout.Start(); 

      // Connect to Client 
      using (cli = new TcpClient()) 
      { 
       cli.Connect(ip, 8888); 

       tConnectTimeout.Stop() 

       Console.WriteLine(ip + " - Yes"); 
       ipAddresses.Add(ip); 
       cli.Close(); 
      } 
     } 
    } 
    catch (ObjectDisposedException ex) 
    { 
    } 
    catch (SocketException ex) 
    { 
     Console.WriteLine(ip + " - No"); 
    } 
} 
+0

事實證明這是空異常處理程序給我的問題。最後的IP給了那個錯誤,而這個錯誤又沒有關閉線程。我已經將Thread.Close()添加到該異常,現在它可以工作。 – Dobz

+0

是啊對不起應該看到立即你應該使用用於處理模式 –

+0

空處理程序在那裏的原因首先是因爲應用程序會立即關閉,如果它不是。 – Dobz

0

從OP的編輯,答案是改變catch塊到以下:

} catch (ObjectDisposedException ex) { 
     //HERE WAS THE PROBLEM. Added these two lines and now working. 
     tConnectTimeout.Stop(); 
     tConnectTimeout.Dispose(); 
    } catch (SocketException ex) { 
     tConnectTimeout.Stop(); 
     tConnectTimeout.Dispose(); 
     Console.WriteLine(ip + " - No"); 
    } 

(請參閱here

但是,我不會推薦此修復方法來正確使用using來管理計時器。

+0

雖然不推薦 –

+0

@JohnNicholas。不 - 絕對。已經明確表示 - 只是想至少妥善清理問題。 –