尝试启动服务时Topshelf窗口服务给出错误1053

时间:2016-09-08 10:02:20

标签: c#-4.0 windows-services topshelf

我使用Topshelf开发了一个Windows服务。它在当地运作良好。当我部署测试并尝试启动服务时,它给了我以下错误:

Error 1053: The service did not respond to the start or control request in a timely fashion.

测试服务器正在Windows Server 2012上运行。

这是我的服务启动和停止方法:

public void Start()
{
    _logProvider.Info("Service started.");

    StartScheduledJobs();
}

public void Stop()
{
    _scheduler.Shutdown(true);

    _logProvider.Info("Service stopped.");
}

private void StartScheduledJobs()
{
    try
    {
        _scheduler.Start();

         ScheduleDeleteJob();
    }
    catch (Exception ex)
    {
        _logProvider.Error("", ex);
    }
}

任何人都可以帮助我解决问题的原因吗?

由于

7 个答案:

答案 0 :(得分:2)

问题是您正在使用Start()方法开始服务工作。

这在开发期间工作正常,但是当您安装服务时,服务控制管理器会调用Start并等待30秒才能返回 - 如果是,则认为该服务已成功安装。

因为您启动了预定作业,但是在Start方法中,它不会在该时间内返回,并且您会收到此错误。

解决方案是在Start中间接启动工作然后返回 - 启动专用线程来执行它,或使用计时器,有很多选项。

答案 1 :(得分:2)

此问题已解决: https://github.com/Topshelf/Topshelf/issues/183

简而言之:当服务启动时,你的Start()方法应该返回true。

答案 2 :(得分:2)

尝试其他所有解决方案均未成功后,我发现了一个解决方案,它使用相同的错误消息解决了我的问题。

public static int Main(string[] args)
{
    Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
    //...
}

基于https://github.com/Topshelf/Topshelf/issues/473

答案 3 :(得分:0)

我不确定您收到的错误消息是实际的错误。如何调试:

  • 使用启动方法开始的日志进行验证。 注意:请确保日志路径是特定的,因为Windows服务可能是在其他帐户下启动的。如果您的日志文件追加程序路径中有${LOCALAPPDATA}之类的东西,那么您会感到困惑,为什么在开发过程中一直使用的路径中没有任何日志。
  • 验证StartScheduledJobs()完成之前已经过去了30秒。
  • 如果“开始”中的代码未执行,则static void main(args [])中的某件事正在发生,导致窗口服务启动,从而导致了此问题。仅当执行 MyService.exe启动时,才可能发生此问题。我建议在HostFactory包装服务之前删除代码。

注意:TopShelf具有log4net插件,您可以安装该插件来跟踪发生异常的位置(http://docs.topshelf-project.com/en/latest/configuration/logging.html)。

答案 4 :(得分:0)

我处于相同的情况...经过两天的调试,一位同事发现我到App.config中通往quartz_jobs.xml的路径不正确。

不正确

<add key="quartz.plugin.jobInitializer.fileNames" value="quartz_jobs.xml" />

正确

<add key="quartz.plugin.xml.fileNames" value="~/quartz_jobs.xml" />

干杯!

答案 5 :(得分:0)

当我第一次学习使用 Topshelf 时,没有提到加速启动方法。下面是我之前的启动方法

public void Start()
{ //instatntiate a bunch of object here, taking up too much time }

这就是我更改代码以加快 Start 方法的方式

public void Start()
{  RunStartUpTasksAysnc();}  //put a reference of start instructions on stack then exit
private async Task RunStartUpTasksAysnc()
{  
    await Task.Run(()=>{//instatntiate a bunch of object here});
}

不是运行一堆构造函数占用分配的时间来启动服务,而是将任务放在堆栈上以异步运行

答案 6 :(得分:0)

就我而言,问题是由这条线引起的

Console.Title = "Some application";