2012-07-09 94 views
1

我已經寫在C#中的Windows服務來記錄所有用戶登錄和註銷,並在表保存在服務器上。的Windows服務的調用OnStop()方法不會被調用

我已經使用了while循環與true條件和檢查在這個循環中的每一分鐘系統的當前用戶,所以我的服務去「開始」的狀態,當我把我的系統上。

一切順利了這裏,但問題是,當我關閉我的系統的OnStop()方法不會被調用。我知道,這個問題是關於服務的狀態啓動時,因爲當我在評論我的服務的OnStart()方法while循環中,OnStop()方法將得到正確執行。

+0

我覺得無限while循環是一個促進的行爲。也許你應該使用一個定時器,每隔1分鐘後觸發 – 2012-07-09 05:20:51

+0

我已經使用定時器(帶定時器控制和代碼),但即使服務沒有啓動。在我大量的搜索中,我發現Windows服務已經一些計時器的問題,並不適用於它。 – 2012-07-09 05:33:51

回答

4

的的OnStart(和調用OnStop)不以加工的,由 - 它們被設計來初始化服務,然後完成。我通常做的是創建一個單獨的thread(這是在創建TPL之前),啓動線程並完成。

在你的情況,則該線程將隨後啓動一個定時器,並等待停止信號,這可以從調用OnStop方法時,服務將停止發送。當停止信號到達時,它應該停止定時器。

+1

嗨馬爾滕,謝謝你的快速回復。我試過你的解決方案,但OnStop()方法沒有成功。 – 2012-07-09 08:17:45

+0

我在等你的回覆,請幫助我。 – 2012-07-10 04:19:08

+0

OnStop方法會發生什麼?拋出異常嗎? – Maarten 2012-07-10 07:58:50

2

的OnStart()必須返回操作系統,下面是MSDN文檔,

服務應用程序被設計爲長時間運行。因此,它通常會輪詢或監視系統中的某些內容。監控是在OnStart方法中設置的 。但是,OnStart實際上並不執行 的監控。一旦服務的操作開始,OnStart方法必須返回到操作系統它不能永久循環或 塊。


要建立一個簡單的投票機制,你可以使用 System.Timers.Timer組件。在OnStart方法中,您將在組件上設置 參數,然後將Timer.Enabled 屬性設置爲true。定時器會定期在您的代碼 中引發事件,此時您的服務可以進行監控。

http://msdn.microsoft.com/en-us/library/aa984464%28v=vs.71%29.aspx