2010-12-23 150 views
3

我已經構建了一個Windows服務,每隔30分鐘在C#中發送一次電子郵件。服務啓動模式設置爲自動。但仍然窗戶不會自動啓動。我需要手動啓動Services.msc並右鍵單擊服務並選擇啓動安裝後Windows Service無法啓動

+1

該服務在哪個帳戶下運行? – 2010-12-23 15:35:19

+1

您的意思是*您重新啓動計算機以完成安裝後? – 2010-12-23 15:36:01

回答

5

當StartMode設置爲自動時,這意味着它將在Windows啓動時啓動。

您可以在安裝程序的自定義操作中自行啓動服務。我假設你已經有一個安裝程序類,並且它已經是你的安裝項目的一個自定義動作,因爲該服務正在安裝,但並未啓動。

覆蓋在你安裝程序類的OnAfterInstall方法,你可以啓動該服務是這樣的:

protected override void OnAfterInstall(IDictionary savedState) { 
    base.OnAfterInstall(savedState); 

    ServiceController sc = new ServiceController(「MyServiceName」); 
    sc.Start(); 
} 

然而,計劃的任務是不是一個壞的路要走。

0

您是否使用installutil安裝它?你是對的,它不啓動服務,即使它被設置爲自動。如果我是你,我會提供一個調用installutil的批處理文件,然後運行'net start whatever'。或者如果您使用其他類型的安裝,那麼也應該提供這種功能。

4

爲什麼要讓自己度過所有開銷和苦難的故障排除和維護基於時間/輪詢應用程序的Windows服務? Windows操作系統內置了對此的支持。只需創建一個簡單的控制檯應用將其作爲計劃任務運行。

您應該已經有單元測試和解耦以使代碼單元可測試。如果你不解決你的問題太困難了。一旦你用這種單元測試格式的代碼翻轉到一個控制檯應用程序是一個明智的選擇。

我知道一個人把所有東西都變成了windows服務並標記爲SOA。爲查詢/基於時間的機制堆放windows服務不是SOA。它與控制檯應用程序相比如此sl and,更難維護,我甚至無法表達它是多麼糟糕的想法。我必須處理大約20-30個這樣的服務,一旦他們轉換爲n層和一個控制檯應用程序,突然間,應用程序的穩定性經歷了屋頂,我的生活變得輕鬆了10倍。所以,請你幫個忙,聽聽經歷了幾個月的人以及這些類型的應用程序的許多迭代。在控制檯應用程序中將其作爲計劃任務運行。

+2

是的,Windows服務是一種痛苦。當你忙於編寫這些技術性的東西時,它確實感覺像是你的搖滾明星開發者,但他們幾乎不可能調試並採取多個步驟來配置和部署新版本。如上所述,計劃任務遠遠優於任務。 – rtpHarry 2010-12-23 15:54:10

2

自動啓動服務會遇到服務初始化順序問題。例如,在嘗試發送電子郵件之前,您有很多依賴關係,TCP/IP堆棧最好處於正常工作狀態。查看Windows事件日誌中是否有阻止OnStart()獲取服務啓動的異常消息。

這可以針對服務進行配置,例如查看Print Spooler服務的Dependencies選項卡。然而,這很難處理,很難確切知道哪些服務需要運行難以編寫配置依賴關係的註冊表項。

解決問題:不要馬上發送電子郵件。等一會,例如30分鐘。