【问题标题】:New Windows Service Application version won't start新的 Windows 服务应用程序版本无法启动
【发布时间】:2011-08-12 13:24:56
【问题描述】:

我有一个正在运行的 Windows 服务。我创建了一个新版本的应用程序。我去了Windows服务器并停止了该服务。然后我为该服务复制了新的 .exe 并尝试启动该服务。该服务无法启动,尝试启动超时,我不知道为什么。我很肯定我以前做过这件事。我需要卸载服务并重新安装吗?

服务器: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

初始化组件: 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

我发现了问题。问题在于一个指令被用来在调试模式和发布模式下执行不同的操作。

【问题讨论】:

  • 事件查看器中有错误消息吗?
  • 事件查看器中的应用程序日志说什么?
  • 如果事件查看器什么也没说,我发现有用的一件事是在调试时将事件日志条目或消息添加到数据库 - 例如“即将调用 DoSomeWork...”和“DoSomeWork已完成”...等。尤其是在包含可能需要一些时间才能完成的过程的循环中。这确实是我想出的轻松调试服务应用程序的唯一方法。它可以让您查看服务在代码中的哪些位置挂起或花费的时间比预期的要长。
  • 既然我已经说过了,我只是想用谷歌搜索如何调试 Windows 服务,当然,微软有一个可能更好的方法:msdn.microsoft.com/en-us/library/7a50syb3(v=VS.80).aspx
  • @David Stratton 我认为在服务管理器终止服务之前,您仍然只有 30 秒的时间来单步执行代码。

标签: .net windows service


【解决方案1】:

如果您更改服务 exe,您确实应该卸载以前的并安装新的。通常您需要重新启动才能完成卸载,然后才能安装新的。

【讨论】:

    【解决方案2】:

    您必须使用“installutil”卸载旧服务,然后再次安装新服务。您可以通过 Visual Studio 命令提示符使用“installutil”。

    附带说明,如果您的服务的 OnStart 方法需要很长时间才能执行,您可能希望在该 OnStart 方法中启动一个计时器来完成所有工作。

    【讨论】:

      【解决方案3】:

      停止服务,更换exe并重新启动应该没问题,我已经这样做了很多次了。

      您在版本之间更改的某些内容在您的 OnStart 中放置了一个需要很长时间的任务。 OnStart 必须在 30 秒内从开始到结束。检查您的 OnStart 代码是否存在阻塞。

      如果您需要调试 OnStart here is some tips 做什么,但 30 秒的限制仍然适用。另一个技巧是在 OnStart 中添加一些日志消息,这会将消息添加到 windows 日志中,显示您的代码已经完成了多远。

      【讨论】:

      • 我正在使用计时器,并且我在 OnStart 事件中启用了计时器。在服务尝试启动时,这是否会发生火灾并可能导致超时?
      • 什么定时器,.net框架里有好几种。您可以做的最有用的事情是在原始问题中发布整个 OnStart 方法作为编辑。只需将其粘贴、突出显示并单击{ } 按钮即可正确格式化。
      【解决方案4】:

      您必须使用 installutil 来安装和卸载。总是,替换 .EXE 不是一个好方法。

      您还必须检查执行服务的用户。默认情况下,我认为它的本地服务没有很多权限,您可以通过代码或使用服务管理单元设置用户。

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

      【讨论】:

        【解决方案5】:

        我找到了问题。服务中隐藏了一些带有调试指令的代码。如果服务是在 Debug 中编译的,那么它就像一个控制台应用程序一样运行,如果它是在 Release 中编译的,那么它作为一个服务运行。所以服务在 OnStart 上超时,因为它试图运行整个控制台应用程序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-06
          相关资源
          最近更新 更多