2010-01-05 106 views
5

我遇到了一個問題,我無法弄清楚我用C#編寫的Windows服務。我試圖做的是等待一個特定的時間段來終止子進程,然後再強迫它終止並停止服務。我已將超時設置爲5到15秒,我的服務會等待適當的時間,然後殺死孩子並在我通過mmc服務窗口停止時停止。但是,如果我關閉計算機,則我的服務會在能夠等待並正常停止之前被吹走。我已經讀過Windows允許在服務關閉之前關閉30秒的超時時間。我的代碼執行時間少於30秒,最大值大約是20秒左右,這取決於我設置的超時時間。強制Windows在關閉時等待服務停止

我已經嘗試在win32 Api中使用SetServiceStatus()函數,但它沒有改變代碼的功能。我已驗證函數調用成功。有沒有其他方法可以強制Windows等待我的服務正常關閉?我正在Windows 7 x86和Windows Vista Sp1 x86中測試它。

回答

2

Windows將不是讓任何服務阻止關機,這是故意的。正如久裏所說,你必須爲你的應用考慮一個不同的設計。

+0

+1:*顯然*這裏的解決方案是讓服務花費更少的時間停下來。所以許多應用程序忽略了這一點的重要性。 – 2010-01-08 17:10:19

0

OnSTart和OnSTop是從一個基本類繼承而來,它對你有很大的幫助。這些方法的所有實現應該做的是啓動或停止客戶端代碼,而Windows將完成剩下的任務。

我會告訴你這一點,因爲我使用C#和.Net的ServiceBase實現做到這一點,我無法權威地談論C/C++代碼或API。

1

這是一個全局Windows設置,顯然是:http://support.microsoft.com/kb/305788。如果我不得不依靠用戶來關閉我的服務,我會擔心的。我會定期保存數據。

+0

這很糟糕。我有一個Windows服務託管虛擬機,需要時間關閉。我不希望它無限期地等待,但更長的超時時間(稍等一會兒)將確保我的機器正常關閉。 – Jens 2012-11-16 00:58:26