2011-08-12 114 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

相关问题