【问题标题】:installing a windows service安装 Windows 服务
【发布时间】:2011-09-11 21:59:49
【问题描述】:

我在 ASP.NET 4.0 中创建了一个 Windows 服务,我在以管理员身份启动命令提示符后使用以下命令安装该服务:

C:\Windows\system32>sc create EnviroTracker1 binpath= "D:\Freelance Work\SuperExpert\git EnviroTrack\EnviroTrack\EnviroTrackerService\bin\Release\EnviroTrackService.exe"

[SC] 创建服务成功

之后,我转到管理员工具 -> 服务,并尝试启动该服务,但出现以下错误:

---------------------------

服务

---------------------------

Windows 无法在本地计算机上启动 EnviroTracker1 服务。

错误 1053:服务没有响应启动或控制 及时提出要求。

---------------------------

好的

---------------------------

我也试过installutil。在这种情况下,也安装了服务,其启动类型为自动,服务属性窗口中的服务状态为自动。请建议我解决此问题。

谢谢。

【问题讨论】:

  • 听起来您的服务已安装,但服务尝试启动时抛出异常。
  • 您的 OnStart 方法中有太多功能?事件查看器中没有错误?

标签: c# windows-services


【解决方案1】:

Amith George 的回答是针对此问题的根本原因,但如果您正在寻找如何调试 Windows 服务的 OnStart,我通常会添加以下内容,因为您可能不够快,无法手动附加到服务。

     protected override void OnStart(string[] args)
     {
        if (args.Contains("DEBUG_SERVICE))
            DebugMode();


         #if DEBUG
             DebugMode();
         #endif



        }

    private static void DebugMode()
    {

        Debugger.Break();
    }

Brian Gideon 还提出了一个很好的观点,即需要“启动一个新线程或以其他方式异步启动您的逻辑”。除非您正在响应系统事件或侦听网络端口,否则应考虑为此使用计时器。 My answer 有一个我用作模板的示例。

【讨论】:

    【解决方案2】:

    编辑:正如您在其中一个 cmets 中提到的,Thread.Sleep 导致 OnStart 等待大约 100 多秒,从而导致错误消息。

    如果您无法使用sc stop EnviroTracker1 停止服务,您可以将服务标记为删除。该服务将在机器重新启动后消失。 sc delete EnviroTracker1


    http://support.microsoft.com/kb/839174

    错误 1053 表示服务在 OnStart 方法中花费了超过 30 秒。时间太长了。就我个人而言,在我的服务 OnStart 中,我只是启动了一个间隔为 2 秒的计时器。我在计时器的经过功能中完成了我通常在 OnStart 中完成的所有工作。这样,我的初始化可以花费自己的时间,并且 OnStart 可以在一秒钟内完成。

    为了帮助您解决具体问题,我们需要具体信息。您在某处提到这似乎是权限问题。是什么让你有这种感觉。更重要的是,为什么不放入一些日志记录语句或异常处理。如果抛出异常,则堆栈跟踪将有所帮助。日志记录将帮助您,进而帮助我们定位问题点。

    事实上你也可以attach a debugger to the service。由于它似乎在 OnStart 中停留了 30 秒,因此您应该有足够的时间将 Visual Studio 调试器附加到服务实例。

    也许你可以发布 OnStart 方法的代码...你知道的,帮助我们帮助你:)

    【讨论】:

      【解决方案3】:

      您需要有一个派生自ServiceBase 的类,并将代码添加到OnStartOnStop 方法。一旦你开始工作,你可以右键单击设计器视图中的任意位置并选择“添加安装程序”,这会将必要的代码添加到允许installutil 注册服务的程序集。

      public class YourService : ServiceBase
      {
        public static void Main(string[] args)
        {
          ServiceBase.Run(new ServiceBase[] { new YourService() });
        }
      
        protected overrides void OnStart(string[] args)
        {
          // Add code to start your logic here. Try to return immediately.
        }
      
        protected overrides void OnStop()
        {
          // Add code to stop your logic here.
        }
      }
      

      可能是在OnStart 方法中,您等待返回的时间过长。你需要确保你只做足够的工作来启动你的服务逻辑。这意味着您可能必须启动一个新线程或以其他方式异步启动您的逻辑。

      【讨论】:

      • @Brain:我已经完成了这一切。我只是在启动服务时出错
      • @DotnetSparrow:您确定OnStart 方法会立即返回吗?服务控制管理器要求服务在合理的时间内响应启动请求。我编辑了我的答案。
      • @Brain:我刚刚看到有 System.Threading.Thread.Sleep(10000000);在开始。我已将其删除,但首先我需要停止服务,但由于其状态正在启动,我无法停止它。是因为这个睡眠吗?请建议
      • 是的。 thread.sleep 是导致服务无法及时启动的原因。执行sc delete EnviroTracker1 ...它会将其标记为删除。重新启动您的机器。该服务将消失。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多