最近做個windows 服務,功能是:定時執行一個任務:自動登錄到一個網站后,點擊相關網面上的按鈕button。
在處理的過程中發現定時器老是不定時的失效,失效時間沒有規律。
由於剛開始處於測試階段,所以只簡單的log一下到時間間隔后是否執行了定時器定時Elapsed事件;結果出錯了,每大約相隔幾個小時就沒有log記錄了,是怎么回事呢?
為什么運行一段時間后(一般幾個小時到十幾個小時)定時器就不工作了,過了一段時間后又會自動工作了。
也就是說 log.Info("Do something on time:"+DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); 這段代碼有時候沒有把當前時間寫到log文件里,過段時間又能自動寫入了。
測試程序比較簡單,如下:
public partial class MyService : ServiceBase
{
#region private methods and fields;
log4net.ILog log = log4net.LogManager.GetLogger("logger");
System.Timers.Timer timer = new System.Timers.Timer(1000);
protected void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer.Enabled = false;
log.Info("Do something on time:"+DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
timer.Enabled = true;
}
public AutoOpenListService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//set timer working.
if (timer != null)
{
timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
timer.Enabled = true;
timer.AutoReset = true;
}
}
protected override void OnStop()
{
if (timer != null)
{
timer.Elapsed -= new System.Timers.ElapsedEventHandler(Timer_Elapsed);
timer.Enabled = false;
}
}
}
}
經過測試,這個困擾我很長時間的問題,原來就是電腦處於睡眠或者休眠的狀態了,使得定時器失效。
一般公司電腦會默認一段時間后電腦處於休眠或不睡眠狀態。手動改為從不休眠或睡眠就行了。問題就解決了。
順便補充一下:待機、休眠、睡眠 區別
1: 電腦待機待機(Standby):將系統切換到該模式后,除了內存,電腦其他設備的供電都將中斷,只有內存依靠電力維持着其中的數據(因為內存是易失性 的,只要斷電,數據就沒有了)。這樣當希望恢復的時候,就可以直接恢復到待機前狀態。這種模式並非完全不耗電,因此如果在待機狀態下供電發生異常(例如停 電),那么下一次就只能重新開機,所以待機前未保存的數據都會丟失。但這種模式的恢復速度是最快的,一般五秒之內就可以恢復。
2:電腦休 眠(Hibernate):將系統切換到該模式后,系統會自動將內存中的數據全部轉存到硬盤上一個休眠文件中,然后切斷對所有設備的供電。這樣當恢復的時 候,系統會從硬盤上將休眠文件的內容直接讀入內存,並恢復到休眠之前的狀態。這種模式完全不耗電,因此不怕休眠后供電異常,但代價是需要一塊和物理內存一 樣大小的硬盤空間(好在現在的硬盤已經跨越TB級別了,大容量硬盤越來越便宜)。而這種模式的恢復速度較慢,取決於內存大小和硬盤速度,一般都要1分鍾左 右,甚至更久。
3:電腦睡眠(Sleep):電腦睡眠是Windows Vista中的新模式,這種模式結合了待機和休眠的所有優點。將系統切換到睡眠狀態后,系統會將內存中的數據全部轉存到硬盤上的休眠文件中(這一點類似休 眠),然后關閉除了內存外所有設備的供電,讓內存中的數據依然維持着(這一點類似待機)。這樣,當我們想要恢復的時候,如果在睡眠過程中供電沒有發生過異 常,就可以直接從內存中的數據恢復(類似待機),速度很快;但如果睡眠過程中供電異常,內存中的數據已經丟失了,還可以從硬盤上恢復(類似休眠),只是速 度會慢一點。不過無論如何,這種模式都不會導致數據丟失。
此處log一下,以防以后忘記!
如果此文對你有幫助