2009-08-05 254 views
2

我們在Visual Studio .NET 2008中使用VB.NET開發了兩項服務。兩者都由單獨的個人(其中一個是我自己)完全分開開發,但兩者在引導過程中都報告了相同的錯誤:啓動後,系統事件日誌中會顯示「服務在啓動時掛起」。在該消息之後,服務繼續正常啓動(僅僅幾條消息就是服務啓動的通知)。是否有關於加載.NET框架或JIT編譯導致這個或哪些代碼的緩慢?手動完成後,它會啓動並停止。 Mine是一個非常簡單的服務,除了框架提供的啓動代碼之外,沒有啓動代碼。Windows服務啓動時啓動

更新1: 這是我的一切處理通信:

host = New ServiceHost(GetType(FSE.Licensing.FSELicense)) 
    host.Open() 

FSELicense沒有定義構造函數,所以它只是得到通過VB.NET提供的默認爲空公共構造,我猜測。

更新2: 我的問題已經演變爲基於一位同事提出的解決方案,該解決方案據說解決了問題。事實上,這個解決方案實際上只是添加了一個我認爲不必要的服務的依賴關係,因爲我的服務在請求完成之前不會執行任何操作。但是,它確實聲明瞭一個COM類型的變量。是否有可能引用此COM類型(即使沒有實例)會導致COM DLL與服務同時加載,並且可能依賴於服務?如果是的話,我沒有意識到COM引用就像.NET中的靜態鏈接。

+0

根本沒有啓動代碼?甚至沒有實例化一個監聽事件的類?如果在啓動時沒有做任何事情,這個服務究竟做了什麼? – David 2009-08-05 16:47:20

+0

是的,它實例化一個偵聽事件的類,但我把它當作框架代碼:)我想這不是真的。 – BlueMonkMN 2009-08-05 19:40:07

+0

host.Open()是做什麼的? 通常,您不應該在OnStart方法中執行任何工作。您應該啓動一個線程來完成實際工作,以便OnStart方法能夠及時返回。 – 2009-08-06 17:16:51

回答

4

我通過向「HTTP SSL服務」(HTTPFilter)服務添加服務依賴項來解決了我的問題。在使用.NET編寫的Windows服務的XP機器上,我遇到了完全相同的問題,它使用netpipe和http綁定暴露了WCF端點。當系統啓動時,它總是掛在主機上。打開()調用,並最終超時。我可以手動啓動服務,沒有任何問題。

請參閱此鏈接瞭解adding a service dependency上的說明。我使用的DependOnService值是HTTPFilter

+0

我通過在IPSEC服務(PolicyAgent)上添加服務依賴性修復了此問題 – 2010-01-22 18:44:43

+0

在其他服務中隨機添加依賴項是一種脆弱的解決方案。 – oefe 2010-05-05 08:12:30

+0

我同意oefe,雖然我們的解決方案不是隨機的;他們被科學證明有效果。 (我自己花了兩個小時測試HTTPFilter的依賴關係,以確保結果是可重複的。)我們的解決方案的問題是我們不明白「爲什麼」他們緩解了這個問題。 – 2010-05-11 15:27:33

0

這是一個猜測,但在系統啓動期間,許多事情在幕後加載,這已經減慢了速度。

然後你還必須擔心依賴於其他服務的組件開始。例如,如果您的服務依賴於依賴於SQL Server數據庫引擎服務的SQL Server代理,則必須等待依次加載。

所以......

根據什麼FSE.Licensing.FSELicense內部做,它可能是在等待,它依賴於第一加載其他服務,或者它可能只是機器很慢,而且加載所有後臺進程的同時發生,您的服務只是與所有這些進程競爭資源。

但是,您看到的警告我只是一個警告。我在我的一些服務上看到了這一點,可能需要一段時間才能加載。這是顯而易見的,我可能甚至不需要這樣說,但服務控制管理器希望服務在特定時間段內加載(我不確定這是什麼),但是如果某個服務似乎掛起,它會記錄此事件消息,但與此同時,該服務仍在嘗試加載。只要你的服務開始了,我不會太擔心這個警告,除非你能看到某種方式來更好地編寫代碼以避免這種情況。

您可以檢查的一件事是在服務控制檯中,查看服務的屬性並查看「依賴項」選項卡。它可能是空白的,但它可能會給你一些見解。

+0

大多數系統上都會發生此問題,包括沒有任何臃腫的新快速系統。只有基於.NET的服務報告這些錯誤。我們已經承認,這只是一個警告,但是現在有多個客戶在問及這些問題,現在我們正在尋求答案。該服務沒有依賴關係,就像我說的那樣,這是一項非常簡單的服務。其他人在那裏創建VB.NET服務並沒有這個問題嗎? – BlueMonkMN 2009-08-06 00:32:11

+0

對不起。我只有我的一個服務有這個問題,我知道爲什麼需要這麼長時間才能開始發生。我從來沒有遇到過這種非常簡單的服務,而且我寫了很多。抱歉,我無法提供更多幫助。 – David 2009-08-06 03:20:45

2

儘量減少處理OnStart;特別是避免阻塞未知的時間;例如不要嘗試連接遠程計算機 - 沒有數據庫查詢,沒有服務請求。

如果您需要做某些可能會阻塞或需要很長時間的事情,請儘可能爲此任務生成一個單獨的線程。

但是,您不能始終避免完全阻止,因爲您需要確保您的服務在從OnStart返回時正常運行。在這種情況下,您可以使用ServiceBase.RequestAdditionalTime來請求更多時間完成OnStart

1

在HTTPFilter上添加依賴項有時可以解決我們的問題。我們對一些Windows Server 2008系統使用了這種解決方法。此HTTPFilter服務似乎並未安裝在某些Windows 7 Professional 64位系統上,這實際上會導致wcf服務主機無法啓動(無法找到依賴項)的問題。