2011-04-21 53 views
11

我正在使用System.Timers.Timer,並且我在c#windows服務中的OnStart方法中使用了類似於以下代碼的代碼。從Windows服務中的OnStart立即啓動timer_elapsed

timer = new Timer(); 
timer.Elapsed += timer_Elapsed; 
timer.Enabled = true; 
timer.Interval = 3600000; 
timer.Start(); 

這導致timer_Elapsed代碼將每隔一小時一個小時後開始,我開始了服務執行。有什麼方法可以在我開始服務的時候執行,然後每隔一小時執行一次?

timer_Elapsed調用的方法花費很長時間才能直接從OnStart運行。

+0

如果在timer.Start()之後調用它,會有什麼問題? – V4Vendetta 2011-04-21 10:33:14

回答

19

只需啓動一個線程池線程來調用worker函數,就像Timer一樣。就像這樣:

 timer.Elapsed += timer_Elapsed; 
     ThreadPool.QueueUserWorkItem((_) => DoWork()); 
    ... 

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { 
     DoWork(); 
    } 

    void DoWork() { 
     // etc... 
    } 
1

使用System.Threading.Timer類,而不是System.Timers.Timer,因爲這類型的僅僅是線程定時器的包裝。

它也適合您的要求。

System.Threading.Timer timer = 
       new System.Threading.Timer(this.DoWork, this, 0, 36000); 

Here是細節。

+0

我做到了,但至少在這裏沒有工作。它在時間開始之前運行該方法,但它在onStart()中運行。 – Thiago 2012-06-28 19:25:23

2

使用System.Timers.Timer的AutoReset屬性並將其值設置爲「true」。 不需要使用timer.Start(),因爲它的功能與timer.Enabled = true相同;

timer = new Timer(); 
timer.Elapsed += timer_Elapsed; 
timer.Enabled = true; 
timer.Interval = 3600000; 
timer.AutoReset = true; 

自動復位= true,將設定表示該定時器應每次提高Elapsed事件當指定間隔過去的值。

0

如果你希望你的Timer立即被解僱,那麼你可以簡單地只是初始化沒有一個指定的時間間隔的Timer對象(它會默認爲100ms幾乎立刻爲:P),然後將調用的函數內的間隔不管你喜歡。這裏是我在Windows服務中使用的一個例子:

private static Timer _timer; 

protected override void OnStart(string[] args) 
{ 
    _timer = new Timer(); //This will set the default interval 
    _timer.AutoReset = false; 
    _timer.Elapsed = OnTimer; 
    _timer.Start(); 
} 

private void OnTimer(object sender, ElapsedEventArgs args) 
{ 
    //Do some work here 
    _timer.Stop(); 
    _timer.Interval = 3600000; //Set your new interval here 
    _timer.Start(); 
}