2017-08-15 51 views
1

我试图运行一些控制台应用程序,Windows服务,我也跟着this question,我做了一些修改,以使其适合于我的应用程序。C#运行控制台应用程序作为Windows服务 - 该服务没有响应错误

我主要的代码看起来像这样:

public static class Program 
{ 
    public class Service : ServiceBase 
    { 

     public Service(string serviceName) 
     { 
      this.ServiceName = serviceName; 
     } 

     protected override void OnStart(string[] args) 
     { 
      Program.Start(args); 
     } 

     protected override void OnStop() 
     { 
      Program.Stop(this.ServiceName); 
     } 
    } 
    #endregion 

    static void Main(string[] args) 
    { 
     if (!Environment.UserInteractive) 
      // running as service 
      using (var service = new Service("TestService")) 
       ServiceBase.Run(service); 
     else 
     { 
      // running as console app 
      Start(args); 
     } 
    } 

    private static void Start(string[] args) 
    { 
     while(true) 
     { 
      //DO SOMTHING 
     } 
    } 

    private static void Stop(string serviceName) 
    { 
     //Writing to log that 'serviceName' stopped 
    } 
} 

我试图运行下面的控制台应用程序作为一种服务,通过使用以下步骤:

1)使用命令:sc创建ServiceTestName123 binPath =“路径到项目调试文件夹中的EXE文件”。

2)使用命令:sc启动ServiceTestName123 “参数1”。

而且我得到了一个错误: “StartService失败1053: 服务没有及时到开始或控制请求”

我了解在互联网上的错误,并发现我可以尝试通过运行另一个线程启动功能来解决这个问题,所以我更新了的OnStart功能下列功能:

protected override void OnStart(string[] args) 
{ 
    Thread t = new Thread(() => Program.Start(args)); 
    t.Start(); 
} 

试图重新创建服务后(删除旧的和创建服务再次用新的OnStart函数)并重新运行它,我得到了相同的错误要么。

顺便说一句,当我跑这个代码作为控制台应用程序,一切正常。

可能有人请explaing我什么我做错了?

非常感谢。

+1

这是一个一般错误消息,你应该检查确切的错误信息Windows事件查看器。 – Winnie

回答

1

我想你的具体步骤,它为我工作。我将强调我遇到的几个关键点

  1. OnStart应该及时返回。即工作应该发生在一个单独的过程/线程中。我使用你的代码线程,它对我很好。
  2. 确保可执行文件位于本地驱动器上,该驱动器可以从您的“本地系统”帐户进行访问,而不会有任何许可问题。
  3. 确保在创建服务时提供绝对路径而不是相对路径。
  4. 确保sc create ...命令响应回来[SC] CreateService SUCCESS
  5. 检查服务是在service control panel
  6. 创建确保你可以从service control panel命令行
  7. 此外,打开任务管理器,或试图之前启动进程管理器,以确保服务的可执行文件运行与否(无论是由服务控制面板或scm start返回什么状态)
  8. 对于调试,我记录的信息到本地的临时文件 - 再次注意权限问题的Wi本地系统帐户。
  9. 如果你要删除的服务不管是什么原因,请确保它确实从service control panel
+0

非常感谢,这非常有帮助 – DimDom

0

消失要调试这是怎么回事,你可以在你的程序非常beggining附加调试启动。

这样,你可以检查你的程序在做什么。

您还可以检查Windows永久查看器,窗口正在抛出的错误。

把这一行在程序的开始跟踪:

System.Diagnostics.Debugger.Launch() 
相关问题