我有一個非常奇怪的錯誤,我似乎無法弄清楚。我會盡我所能把這件事放在一邊。計時器在表格關閉時不停止
語境:我有一個應用程序,它會不斷地坪約一組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。
- 調用在計時器上處理它自己。這些
都沒有奏效。 我希望我沒有過多的代碼和寫作你們。任何幫助,將不勝感激。
我看不到您的停止功能,您實際停止計時器。我會停止註銷監聽器,停止計時器,然後處置並設置爲空。如果您想要更加安全,請添加一個檢查以查看計時器是否仍爲空或不在處理器 – JeremyK 2013-03-21 20:16:21
對不起。我已經添加了它。 – Botonomous 2013-03-21 20:18:29
爲什麼你在構造函數中調用start,然後再次調用Start函數? – JeremyK 2013-03-21 20:20:51