2011-09-22 103 views
4

我在Windows服務中使用System.threading.timer。 但定時器沒有成功執行。下面是代碼。System.threading.timer在Windows服務中不起作用

protected override void OnStart(string[] args) 
    { 
     try 
     { 
     eventLog1.WriteEntry("In OnStart"); 
     TimeSpan dueMinutes = TimeSpan.FromMinutes(1); 
     TimeSpan fromMinutes = TimeSpan.FromMinutes(1); 
     System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(CallBack), null, dueMinutes, fromMinutes); 


      /* 
     System.Timers.Timer timer = new System.Timers.Timer(5 * 60 * 1000);  
     timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);    
      DBSyncHandler sync = new DBSyncHandler(); 
      sync.startSync();     
     */ 
     } 
     catch (Exception ex) 
     { 
      if (!System.Diagnostics.EventLog.SourceExists("MySource")) 
      { 
       System.Diagnostics.EventLog.CreateEventSource("MySource", "MyEventLog"); 
      } 
      eventLog1.Source = "MySource"; 
      eventLog1.Log = "MyEventLog"; 
      eventLog1.WriteEntry("Error : " + ex.Message); 
     } 

    } 



    public static void CallBack(object sender) 
    { 

     try 
     { 
      DBSyncHandler sync = new DBSyncHandler(); 
      sync.startSync(); 
     } 
     catch (Exception ex) 
     { 
      EventLog eventLog1 = new EventLog(); 
      if (!System.Diagnostics.EventLog.SourceExists("MySource")) 
      { 
       System.Diagnostics.EventLog.CreateEventSource("MySource", "MyEventLog"); 
      } 
      eventLog1.Source = "MySource"; 
      eventLog1.Log = "MyEventLog"; 
      eventLog1.WriteEntry("Error : " + ex.Message); 
     } 

    } 

後全成安裝。我的工作站restarted.On重新啓動機器,該服務被稱爲successfully.But一旦該服務被稱爲第一次,不重複進行下一時間段即服務不叫再次。

回答

13

閱讀MSDN上的注意事項:http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

只要你使用的是定時器,你必須保持一個參考吧。由於 與任何託管對象有關,因此當 中沒有對它的引用時,Timer將進行垃圾回收。定時器仍處於活動狀態的事實 並不妨礙它被收集。

System.Threading.Timer是一個簡單,輕量級的計時器,它使用 回調方法並由線程池線程提供服務。建議用於Windows窗體的不是 ,因爲它的回調在用戶界面線程上不會發生 。 System.Windows.Forms.Timer是 用於Windows窗體的更好選擇。對於基於服務器的定時器 功能,您可以考慮使用System.Timers.Timer,其中 引發事件並具有其他功能。

我認爲您在OnStart中創建的計時器對象是gc收集或處置的。它不應該是該方法中的局部變量,因爲它超出了範圍。

+0

之前我來搜索這個我是另外一件事情,但仍然沒有答案,我也持有在類作爲領域的參考。那就是說,計時器的實現應該在後臺運行。後臺線程會在主線程完成後終止,...(我並不完全確定服務中的這個問題,但這就是我想的) – deadManN