安装Windows服务然后尝试运行时,出现错误1053。说我的服务启动时间太长

时间:2019-12-17 03:14:41

标签: c# windows-services

  

错误1053:Windows服务无法及时启动

我已经按照无数在线教程中的显示设置了我的服务,但是我的OnStart方法似乎根本没有被调用。该过程应该运行,然后无限循环,并不断检查服务器上要运行的命令。这是我的主菜单:

static void Main(string[] args)
{
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new AgentService(args)
        };
        ServiceBase.Run(ServicesToRun);
}

这是我的服务构造函数和OnStart的样子:

public AgentService(string[] args)
{
        InitializeComponent();
        this.Args = new ServiceArguments();
        this.ValidArgs = this.Args.SetArgs(args);
        this.AgentCycle = Int32.Parse(Args.Cycle);
}

protected override void OnStart(string[] args)
{
        ServiceStatus serviceStatus = new ServiceStatus
        {
            dwCurrentState = ServiceState.SERVICE_START_PENDING,
            dwWaitHint = 100
        };
        this.CimCommands = new Dictionary<string, CimCommand>();
        SetServiceStatus(this.ServiceHandle, ref serviceStatus);
        serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;
        SetServiceStatus(this.ServiceHandle, ref serviceStatus);

        if (this.ValidArgs) 
           RunAgent();
}

我正在通过命令行传递args,但是如果没有给出,则我正在使用环境变量。所有这些都存在于我的机器上,所以我无法理解为什么我的服务没有以“及时的方式”启动。我只有2个额外的依赖项。一个是Newtonsoft.Json,另一个是RestSharp

我也尝试过使用TopShelf将其编写为控制台应用程序,但这种方式也存在相同的错误。逻辑很合理,我已经测试了我的方法。有任何想法吗?

编辑:好的,这是解释该服务目标的最佳方法...该服务应该每5秒调用一次api /服务器,然后接收一个json告诉它什么命令在Windows计算机上运行。一旦完成所有这些命令,它将再次询问服务器是否有任何工作要完成,并且重新开始。自定义类型只是与Newtonsoft一起使用的json_objects,而Service Arguments只是一个具有5个字符串值和1个bool的对象。然后是用于从cmd行,环境变量或配置文件解析参数的函数。

1 个答案:

答案 0 :(得分:0)

  

是的,从RunAgent调用的函数中肯定有无限循环。

虽然RunAgent()没有返回,但是OnStart()没有返回。当OnStart()不返回时,服务管理器将终止该进程,因为“启动需要很长时间”。不要将无限循环放入OnStart函数!

有一次,该消息正是它所说的。它也确实可以解决问题(让您修复错误的代码)。为了进行轮询,您需要在“ onStart()”中启动的计时器之类的东西。也许是单独的后台任务或线程。不是自定义循环,您可以使用它来阻止OnStart()。