繁体   English   中英

安装 windows 服务

[英]installing a windows service

我在 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] 创建服务成功

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

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

服务

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

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

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

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

好的

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

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

谢谢。

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

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


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

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

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

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

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

您将需要一个派生自ServiceBase的 class 并将代码添加到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方法中等待返回的时间过长。 你需要确保你只做足够的工作来启动你的服务逻辑。 这意味着您可能必须启动一个新线程或以其他方式异步启动您的逻辑。

几个月前,我需要创建一个 windows 服务,我发现这个LINK这个非常有用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM