安装Windows服务

时间:2011-06-09 17:28:34

标签: c# windows-services

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

  

C:\ Windows \ system32> sc创建EnviroTracker1 binpath =“D:\ Freelance Work \ SuperExpert \ git   EnviroTrack \ EnviroTrack \ EnviroTrackerService \ BIN \发布\ EnviroTrackService.exe“

     

[SC] CreateService SUCCESS

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

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

服务

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

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

     

错误1053:服务未响应启动或控制   要求及时。

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

好的

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

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

感谢。

4 个答案:

答案 0 :(得分:2)

编辑:正如您在其中一条评论中提到的,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 debuger连接到服务实例。

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

答案 1 :(得分:1)

您需要拥有一个源自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方法中等待的时间太长而无法返回。您需要确保只做足够的工作来启动服务的逻辑。这意味着您可能必须启动新线程或以其他方式异步启动逻辑。

答案 2 :(得分:0)

几个月前我需要创建一个Windows服务,我发现这个LINKTHIS非常有帮助。

答案 3 :(得分:0)

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有一个我用作模板的示例。