2012-08-12 48 views
5

我發現this answer,我嘗試做遵循,但是當我開始我的服務。它並沒有給我帶來任何工作。我無法理解的一件事是:`_timer = new Timer(10 * 60 * 1000); //每10分鐘預約C#Windows服務來執行日常任務

我想下午10:00每天執行我的服務,我怎麼能做到這一點?

+0

根據您想要運行的內容,將其構建爲控制檯應用程序並讓Windows任務計劃程序隨時運行它可能會更好。 – 2012-08-12 01:02:07

+0

@你能否接受Adil的回答?這工作正常,也很好的解決方案。 :)因爲這個問題是未被回答的類別。 +1你的問題和'Adil'的答案。有用:))))。, – RajeshKdev 2014-04-10 09:21:08

回答

7

你可以找出current time和你desired schedule time之間的difference並做出相應的推移間隔。這樣的計時器will fire once在預定時間的事件。時間間隔設置爲24小時。

private System.Timers.Timer _timer;  

private void SetTimer() 
{ 
    DateTime currentTime = DateTime.Now; 
    int intervalToElapse = 0; 
    DateTime scheduleTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 10,0,0); 

    if (currentTime <= scheduleTime) 
     intervalToElapse = (int)scheduleTime.Subtract(currentTime).TotalSeconds; 
    else 
     intervalToElapse = (int)scheduleTime.AddDays(1).Subtract(currentTime).TotalSeconds; 

    _timer = new System.Timers.Timer(intervalToElapse); 

    _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed); 
    _timer.Start(); 
} 

void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
     //do your work 
     _timer.Interval = (24 * 60 * 60 * 1000); 
} 
+1

我一定要使用''OnStart'方法SetTimer'? – Nothing 2012-08-12 01:36:43

+2

你可以隨時隨地調用它,但是調用OnStart將確保它不會錯過任務計劃。 e.g服務於9:58開始,那麼它必須被調用,使計時器過去的10 – Adil 2012-08-12 01:48:46

+1

尼斯一個事件!^____ ^ – Sai 2015-02-10 12:26:04

1

即使計時器是你參考答案每十分鐘輪詢 - 它只是處理每天一次:

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    // ignore the time, just compare the date 
    if (_lastRun.Date < DateTime.Now.Date) 
    { 

要做到這一點,在上午10:00添加另一個條件,如:

_lastRun.Date < DateTime.Now.Date & & DateTime.Now.Hour = 10

十分鐘是用作輪詢頻率的時間。

+0

那麼你能告訴我,那10分鐘是什麼意思?謝謝。 – Nothing 2012-08-12 01:01:13

+0

請參閱我的編輯。如果你想在代碼上計劃任務運行它只是有,當你開始使用命令行參數,運行過程中的exe文件,但是如果你雙擊exe文件,將告訴你如何運行的說明無人看管 - 這樣當人們想知道程序的功能時,人們不會意外啓動一個程序。 – 2012-08-12 01:07:46

3

Windows有一個內置的任務調度程序,它可以更好地用於任何調度需求。處理日程安排任務時會遇到很多問題,例如系統重啓,日光節約等。

可以指博客由Ayende有關的一些問題與錯誤使自己的調度。 Rotten scheduling: Don’t roll your own

4

而不是滾動自己的計時器,你可以使用Quartz.NET來承載服務。它運行良好,並具有一些附加功能,如追趕(如果您需要)以及提供服務的能力。

http://quartznet.sourceforge.net/

+0

嗯 - 這聽起來不錯,但我看了一下頁面,它沒有太多的信息,你有代碼示例嗎? **編輯** - [發現](http://quartznet.sourceforge.net/tutorial/lesson_1.html) – 2012-08-12 01:11:52