我使用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);
}
}
任何人都可以帮助我解决问题的原因吗?
由于
答案 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);
//...
}
答案 3 :(得分:0)
我不确定您收到的错误消息是实际的错误。如何调试:
${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";