2011-08-12 93 views
0

我有一個已經運行的Windows服務。我創建了一個新版本的應用程序。我去了Windows服務器並停止了服務。然後我複製了新的服務的.exe文件並嘗試啓動該服務。該服務不會啓動,它試圖開始超時,我不知道爲什麼。我確信我之前已經做到了這一點。我需要卸載服務並重新安裝嗎?新的Windows服務應用程序版本不會啓動

服務器:Windows Server 2003 R2的 應用.NET版本:2.0 開發了:VS 2005 語言VB.NET

OnStart方法:

Protected Overrides Sub OnStart(ByVal args() As String) 
    ' Add code here to start your service. This method should set things 
    ' in motion so your service can do its work. 
    Me.Timer1.Enabled = True 
End Sub 

的InitializeComponent: CHECKDB_INTERVAL_TIME = 10

Private Sub InitializeComponent() 
    Dim iWaitTime As Int16 
    iWaitTime = CType(ConfigurationManager.AppSettings("CHECKDB_INTERVAL_TIME"), Int16) 
    Me.components = New System.ComponentModel.Container 
    Me.Timer1 = New System.Timers.Timer() 
    Me.Timer1.Interval = iWaitTime * 60000 
    ' 
    'HarleyCloser 
    ' 
    Me.ServiceName = "MyService" 

End Sub 

Friend WithEvents Timer1 As System.Timers.Timer 

我發現了這個問題。問題出在一個指令被用來在調試模式和釋放模式下做一些不同的事情。

+2

事件查看器中的任何錯誤消息? – iandotkelly

+2

*事件查看器*中的*應用程序日誌*說什麼? – jgauffin

+1

如果事件查看器什麼都沒說,我發現有一件事很有幫助,就是在調試時將事件日誌條目或消息添加到數據庫 - 例如「關於調用DoSomeWork ...」和「DoSomeWork Completed」等。特別是在包含可能需要一些時間才能完成的過程的循環中。這真是我想通過簡單的方式調試服務應用程序的唯一方法。它可以讓你看到代碼中的服務掛起或比預期更長的時間。 – David

回答

0

我找到了問題。調試指令在服務中隱藏了一些代碼。如果服務是在Debug中編譯的,那麼它就像一個控制檯應用程序一樣運行,如果它是在Release中編譯的,那麼它就像服務一樣運行。因此,該服務在OnStart上超時,因爲它試圖運行整個控制檯應用程序。

0

如果您更改服務exe,您確實應該卸載前一個並安裝新的。通常您需要重新啓動才能完成卸載,然後才能安裝新的。

+0

這沒有奏效。 – Adam

0

停止服務,更換exe並重新啓動它應該沒問題,我已經做了很多次了。

您在版本之間更改的內容會在OnStart中放置需要很長時間的任務。 OnStart必須從30秒開始到結束。檢查你的OnStart代碼是否有阻塞。

如果您需要調試OnStart here is some tips做什麼,但30秒的限制仍然適用。另一個提示是將一些日誌消息放入OnStart,它將向Windows日誌添加消息,以顯示您的代碼得到了多少。

+0

我正在使用計時器,並在OnStart事件中啓用計時器。當服務試圖啓動時,這種情況是否會引發火災並可能導致暫停? – Adam

+0

什麼樣的定時器,在.net框架中有幾種。您可以做的最有用的事情是將您的原始問題中的整個OnStart方法作爲編輯發佈。只需粘貼它,突出顯示它,然後單擊「{}」按鈕以正確格式化它。 –

0

您必須使用「installutil」卸載舊服務,然後再次安裝新服務。您可以通過Visual Studio命令提示符使用「installutil」。請注意,如果您的服務的OnStart方法需要很長時間才能執行,那麼您可能需要啓動一個定時器,該定時器在OnStart方法內完成所有工作。

+0

這沒有奏效。 – Adam

0

您必須使用installutil進行安裝和卸載。總是,替換.EXE不是一個好方法。

您還必須檢查執行服務的用戶。默認情況下,我認爲它的本地服務沒有很多權限,您可以通過代碼設置用戶或使用服務管理單元。

this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.User; this.serviceProcessInstaller1.Password = ConfigurationSettings.AppSettings [「password」]; this.serviceProcessInstaller1.Username = ConfigurationSettings.AppSettings [「username」];

+0

卸載並重新安裝該服務不起作用。 – Adam

相關問題