2012-04-03 100 views
2

我寫了一個Windows服務來叫我的類庫,每10分鐘間隔,它在啓動時或重新啓動。一旦工作完成它想重新再每10組分鐘的運行工作正常這根本就沒有發生。不知道什麼是錯過的,有人請確定正確的方式。的Windows服務沒有啓動,根據間隔時間

這裏是我的代碼

public partial class Service1 : ServiceBase 
{ 
    private Timer _timer; 
    private DateTime _lastRun = DateTime.Now; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     _timer = new Timer(10 * 60 * 1000); // every 10 minutes 
     _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
     Shell Distribute= new Shell(); 
     Distribute.Distribute(); 
    } 

    protected override void OnStop() 
    { 
     this.ExitCode = 0; 
     base.OnStop(); 

    } 
    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     //if (_lastRun.Date < DateTime.Now.Date) 
     //{ 
      _timer.Stop(); 
      _lastRun = DateTime.Now; 
      _timer.Start(); 
     //} 
     } 

    } 
} 
+1

日期比較是最可能的原因。但是,Timer類在觸發Elapsed事件時會吞下異常。您*必須*使用try/catch來診斷代碼中的任何故障。不要跳過它,如果你這樣做的話,異常是不可想象的。 – 2012-04-03 13:52:59

+0

@ HansPassant,即使我評論如果條件語句仍然是其無法運行該服務,每10分鐘間隔 – Usher 2012-04-05 01:36:26

回答

0

Okie最後我得到了答案,爲什麼它不工作(一名來自另一論壇的專家指出我的錯誤)

此代碼工作以及基於定時器間隔。

 public partial class Service1 : ServiceBase 
{ 
    private Timer _timer; 
    private DateTime _lastRun = DateTime.Now; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     _timer = new Timer(10 * 60 * 1000); // every 10 minutes 
     _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
     Shell Distribute= new Shell(); 
     Distribute.Distribute(); 
_timer.start();//this line was missed in my original code 
    } 

    protected override void OnStop() 
    { 
     this.ExitCode = 0; 
     base.OnStop(); 

    } 
    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     //if (_lastRun.Date < DateTime.Now.Date) 
     //{ 

try 
{ 
_timer.Stop(); 
Shell Distribute= new Shell(); 
Distribute.Distribute(); 
} 
catch(exception ex) 
{} 
finally 
{ 

      _timer.Start(); 
} 
     //} 
     } 

    } 
} 
+0

有道理。我現在看到它的時候沒有正確地閱讀你的問題。您確實在服務啓動事件中啓動了該作業,但從未啓用計時器。我想我需要新的眼鏡。當你開始或重新啓動這個主要提示時,你確實說得很好。我會將一些日誌記錄添加到catch塊中,以便在計時器事件期間看到是否有任何錯誤。沒有比吞服錯誤的服務更糟的了。 – Namphibian 2012-04-05 12:39:53

+0

我同意Namphibian,我將添加日誌來查找服務啓動時發生了什麼。 – Usher 2012-04-06 01:09:38

3

您的問題是比較日期if (_lastRun.Date < DateTime.Now.Date)的讓你的代碼每天運行一次。

+0

我徹底改變了我的代碼和註釋的部分還是它的基於時間間隔不運行,我不知道如何調試這一個。 – Usher 2012-04-05 01:25:44

2

我同意Özgür的。看來你的邏輯是錯誤的。您可以在timer_Elapsed活動期間剛剛停止計時器你的邏輯和重啓定時器

喜歡的東西:

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 

    try{ 
     // stop the timer while we are running the cleanup task 

     _timer.Stop(); 
     // 
     // do cleanup stuff 
     // 
    }catch (Exception e){ 
     //do your error handling here. 
    } 
    finally{ 

     _timer.Start(); 
    } 

    } 
} 

與嘗試捕捉只是包裝它,並最終使你處理異常,可以確保定時器再次開始。此外,請查看以下鏈接Best Timer for using in a Windows service

+0

,我試過你的方法,但它不起作用 – Usher 2012-04-05 01:44:29

+0

我可以在這裏提出建議。爲什麼不把某種形式的日誌記錄放入服務中。然後將調試消息寫入日誌。我通常使用一個簡單的文本文件與調試信息。這可以幫助您跟蹤問題。另外請確保你記錄異常。 – Namphibian 2012-04-05 06:48:23