2013-03-21 31 views
0

我有一個非常奇怪的錯誤,我似乎無法弄清楚。我會盡我所能把這件事放在一邊。計時器在表格關閉時不停止

語境:我有一個應用程序,它會不斷地坪約一組IP的生活在不同的位置。 (我們需要看到,如果每個設備達在給定時間)

錯誤:當ping一臺主機,他們的互聯網已關閉,應用程序顯示所有設備都下來(因爲它應該)。但是,當關閉應用程序時,進程(主應用程序exe)仍在運行,我們的路由器流量顯示連續ping仍在運行(相同的時間間隔)。所以它就像定時器繼續。

但是,當應用程序被關閉,組起了,進程關閉,因爲它應該和所有坪停止。

我可以提供任何你想看的代碼。生病先給基礎:

我有一個叫EquipmentObj類。在構造函數中,一個連續的ping開始(異步) *注意,這全部在單獨的表單上完成,而不是在mainform上完成。 構造和特性:

System.Timers.Timer TimerObj { get; set; } 
public EquipmentObj(string ipAddress) 
     { 
       this.IP_Address = ipAddress; 
       this.TimerObj = new System.Timers.Timer(); 
       this.TimerObj.Interval = 2000; 
       this.TimerObj.Elapsed += TimerObj_Elapsed; 
       this.TimerObj.AutoReset = true; 
       this.start(); 
     } 

開始,經過的方法:

private void start() 
     { 
      this._requestStop = false; 
      this.TimerObj.Start(); 
     } 


     private void TimerObj_Elapsed(object sender, System.Timers.ElapsedEventArgs  e) 
      { 
       if(!_requestStop) 
        base.start_Ping(this.Ip_Address); 
      } 

基類:

public void start_Ping(string ipAddress) 
     { 
      try 
      { 
       Ping pingSender = new Ping(); 


       // Create the event Handler 
       pingSender.PingCompleted += pingSender_PingCompleted; 

       // Create the buffer 
       // Reference buff size: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 
       byte[] packetData = Encoding.ASCII.GetBytes("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); 
       // Create the pingOptions object 
       PingOptions packetOptions = new PingOptions(); 
       // Parse the passed ip address to a proper ipaddress object 
       IPAddress ip = System.Net.IPAddress.Parse(ipAddress); 

       // Send async 
       pingSender.SendAsync(ip, 1050, packetData, ip); 
      } 
      catch (Exception ex) 
      { 
       Error_Log.write_log(ex); 
      } 
     } 

     public virtual void pingSender_PingCompleted(object sender, PingCompletedEventArgs e) 
     { 
      throw new NotImplementedException(); 
     } 

實現平安完成:

public override void pingSender_PingCompleted(object sender, PingCompletedEventArgs e) 
     { 
      if (e.Reply.Status == IPStatus.Success) 
       this.status = "On Line"; 
      else 
      { 
       this.status = "Off Line"; 
       this.setBounced = ++this.setBounced ?? 1; 
      } 
      this.setResponse = e.Reply.RoundtripTime.ToString(); 
     } 

最後我清理這就是所謂的形式結束:

foreach (EquipmentObj obj in this.objectListView1.Objects) 
       { 
        obj.Stop(); 
       } 

這裏是站:

public void Stop() 
     { 
      this._requestStop = true; 
      this.TimerObj.Stop(); 
     } 

我已經試過:

  • 添加清理(上圖)到閉幕活動。
  • 將我的定時器從system.threading定時器移至system.timer定時器。
  • 我已經嘗試實現無與倫比的。
  • 在表單關閉事件中將定時器設置爲null。
  • 調用在計時器上處理它自己。這些

都沒有奏效。 我希望我沒有過多的代碼和寫作你們。任何幫助,將不勝感激。

+1

我看不到您的停止功能,您實際停止計時器。我會停止註銷監聽器,停止計時器,然後處置並設置爲空。如果您想要更加安全,請添加一個檢查以查看計時器是否仍爲空或不在處理器 – JeremyK 2013-03-21 20:16:21

+0

對不起。我已經添加了它。 – Botonomous 2013-03-21 20:18:29

+0

爲什麼你在構造函數中調用start,然後再次調用Start函數? – JeremyK 2013-03-21 20:20:51

回答

0

我最好的辦法是在停止被調用之前拋出異常。我將在那裏放置更多的try { } catch聲明,以便您可以處理錯誤。

您可能需要您試圖訪問同一線程上沒有創建對象的某些線程問題。

我會檢查你是否需要隨時調用你的計時器對象。

void Stop() 
{ 
    if (objectListView1.InvokeRequired) 
    { 
     objectListView1.BeginInvoke(new Action(Stop)); 
     return; 
    } 

    foreach (EquipmentObj obj in this.objectListView1.Objects) 
    { 
     obj.Stop(); 
    } 
} 
+0

標記爲答案。不是什麼問題,但傑里米把我帶到那裏。謝謝 – Botonomous 2013-03-21 20:45:52

+0

很高興你解決了,/歡呼聲。 – JeremyK 2013-03-21 21:39:01