2010-01-06 24 views
7

我一直在做一些廣泛的測試,我一直在用C#.Net 3.5編寫Windows服務。即使我正在調用RequestAdditionalTime()方法,它應該更新SCM並保持我的服務正在運行,但在重新啓動或關閉計算機時,我無法讓Windows爲我的服務提供足夠的時間來正常關閉服務。但是,如果我手動停止服務,我的代碼正常工作。我主要一直在Windows Vista和Windows 7中測試此代碼,決定在Windows XP中測試代碼時一切正常。有誰知道爲什麼這個調用在Vista/7中不起作用?我想我需要一些權限來保持系統關閉,我默認在Xp中獲得,但不是在Vista/7中。爲什麼在Vista/7中重新啓動RequestAdditionalTime()方法時不起作用?

回答

6

如果系統沒有關閉,您的服務可以請求額外的時間,您的進程不會被殺死。

如果系統關閉,您的服務必須關閉。你甚至沒有得到正常服務的30秒。關機比以前更有力。

+2

有沒有辦法知道的時候你的服務將得到關機量,當你關機或重新啓動計算機?我知道W7中的WaitToKillServiceTimeout設置爲12000,Vista中的Xp設置爲20000。但即使您在W7或Vista中更改此值,也幾乎沒有影響。特別是在Windows 7中,它會在幾秒鐘內跺腳你的服務。感謝您的洞察力。 –

+0

我覺得沒有辦法知道。假設Windows允許13秒關閉所有服務。某些其他服務需要12秒的CPU時間(因此其他服務在此期間無法執行),最後關閉。剩下的只剩下1秒鐘。 Windows將會殺死他們。 –

2

在非停機的情況下,RequestAdditionalTime()必須往往比每2分鐘叫:

protected override void OnStop() 
    { 
     Thread.Sleep(60000); 
     RequestAdditionalTime(180000); 
     Thread.Sleep(60000); 
     RequestAdditionalTime(180000); 
     Thread.Sleep(5000); 
    } 

注意,雖然名稱,時間參數要求的總關機時間。

+0

你有參考時間參數的含義嗎?它沒有在MSDN上列出。 –

+1

@David:這是一年前的事,但我記得它是從測試中推導出來的。 –

+0

這在Windows 7中不起作用(但在此配置)。另外,這個例子沒有清楚地說明更多的時間,因爲默認值是120s(這裏),只顯示了〜125s的睡眠時間。 – user2864740

相關問題