2011-05-18 76 views
2

我在Windows服務中使用System.Threading.Timer來定期執行方法。 定時器只會觸發一次,它不會觸發。任何人都可以請幫忙。C#Windows服務計時器未觸發

下面是代碼

private TimerCallback timerDelegate; 

protected override void OnStart(string[] args) 
{ 
    timerDelegate = new TimerCallback(DoWork); 
    serviceTimer = new Timer(timerDelegate, null, 1000,Timeout.Infinite); 
} 

private void DoWork(object state) 
{ 
    GetMessages(); 
} 
+1

也許這可以幫助http://stackoverflow.com/questions/3486672/c-timer-slowing-down-a-loop/3486691#3486691 – adopilot 2011-05-18 20:14:37

回答

3

在函數調用的最後一個參數(Timeout.Infinite)告訴它第一次使用它觸發和每個隨後的時間之間的無限間隔。所以它會在1秒之後再次發射,然後再也不會發生。你或許應該這樣做:

serviceTimer = new Timer(timerDelegate, null, 1000, 1000); 

documentation

回調的調用之間的時間間隔,以毫秒爲單位。指定Timeout.Infinite禁用定期信號。

+0

得到消息我改變了它..它仍然沒有射擊..我錯過了什麼?我必須在Windows服務中做其他任何事嗎? – srikanth 2011-05-18 20:31:17

+0

@srikanth:您確定在進行建議更改後它不會啓動?你的'GetMessages'方法是否會拋棄定時器或以任何方式改變它? – 2011-05-18 20:35:42

+0

否..消息實際上仍在隊列中。我認爲計時器不工作..當啓動服務..在onStart事件它獲取消息,就是這樣..計時器不會觸發。 – srikanth 2011-05-18 20:40:37

1

第一超時值是多長時間等待回調的第一次調用,但第二個是重複間隔。例如,您可以將其設置爲等待5分鐘以獲得第一個「打勾」,然後每分鐘重複一次。

通過傳遞Timeout.Infinite作爲最後一個參數,您告訴它只調用一次。

MSDN:System.Threading.Timer constructor

+0

改成了serviceTimer = 新的定時器(timerDelegate,空, 1000,1000);它仍然不會開火..我錯過了什麼?請幫助 – srikanth 2011-05-18 20:26:50

+0

如何做到這一點?你有什麼例子嗎?謝謝 – srikanth 2011-05-18 20:43:25

+0

GetMessages用於從隊列 – srikanth 2011-05-18 21:02:11