Windows服务无法启动(错误1053)。

15

我有一个Windows服务,现在我正在尝试调试它。尽管当前代码曾经可用,但现在它无法启动。错误信息为:

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

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

为了隔离错误,我试图将所有内容都注释掉。主要方法看起来像这样:

TextWriter tt = new StreamWriter(@"C:\startup.text", true);
tt.WriteLine("Starting up the service");
tt.Close();

ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] 
   { 
       new MyService()
   };

TextWriter tt2 = new StreamWriter(@"C:\startup.text", true);
tt2.WriteLine("Run...");
tt2.Close();

它将"Starting up the service"和"Run..."都打印到日志文件中。我也清空了MyService的内部内容。在任何代码周围都有try/catch,现在被缩减为像上面那样的一些日志行。我从未进入过catch语句,否则会记录它。

OnStart中的所有内容都已被注释掉:

protected override void OnStart(string[] args)
{
}

我已经没有什么想法了。我认为错误是因为Start方法从未完成(或者在30秒内完成)。是否有其他方法被调用?欢迎提出任何想法。

额外信息: MyService中的构造函数为空。如果插入一些Thread.Sleep(5000)语句,则需要更长时间才能弹出关于错误1053的消息。Main方法似乎必须退出(没有错误)。


请确保捕获所有未处理的异常并将它们写入您的日志中。例如:https://dev59.com/2HVD5IYBdhLWcg3wL4iM... 这可能会为您提供更多有关其失败原因的信息。 - Christophe Geers
3个回答

14

您遗漏了ServiceBase.Run调用:

ServiceBase[] servicesToRun = new ServiceBase[]
                                { 
                                    new MyService() 
                                };
ServiceBase.Run(servicesToRun);

订阅未处理异常通知可能也是一个好主意:

static void Main() {
    ...
    AppDomain.CurrentDomain.UnhandledException 
                                      += CurrentDomain_UnhandledException;
    ...
}

private static void CurrentDomain_UnhandledException(
                                                 Object sender, 
                                                 UnhandledExceptionEventArgs e) {

    if (e != null && e.ExceptionObject != null) {
        // log exception:
    }
}

由于.NET/SCM会吞噬异常,因此请在OnStart中添加以下try/catch语句:

protected override void OnStart(String[] args) {
    try {

    } catch(Exception e) {
        // log exception:
        throw;
    }
}

1
另外,如果您想调试服务初始化,可以在初始化代码中调用System.Diagnostics.Debugger.Break()。当到达此行时,Windows会询问您是否要启动调试器,从而使您能够从该点开始调试服务。 - Polyfun
1
谢谢。在此过程中,ServiceBase.Run(servicesToRun);这行代码被注释掉了。 - Kasper Hansen
1
对我来说,问题出在调试条件设定为在不调用 ServiceBase.Run(serviceToRun); 的情况下运行。 - absynce
这在我的情况下起作用了,帮助了我的队友,他差点就要疯了。非常感谢!!! - Aimal Khan

1

虽然这个帖子有点老了,但是我想补充一下我的回答,因为它可能会帮助其他人节省时间,而我花了几个小时:

情况

  • 用C#编写的Windows服务,监视目录并将文件中解析出来的消息发布到MQTT主题,在Win10上运行良好,在家里的WinXP上进行短暂测试也可以运行良好

  • 在生产环境中,服务在Win10上运行良好,在WinXP上运行几个小时后崩溃,无法重新启动(无法在本地计算机上启动filemqttservice服务。错误1053:服务没有及时响应启动或控制请求

解决方案

清除事件日志历史记录!(笨蛋!)我的服务太喜欢说话了,在几个小时内填满了事件日志缓冲区。清除事件日志后,服务再次启动。当然,我删除了服务中产生消息的所有行。


0

只需检查两侧的 .net 框架是否相同,或者安装方面的框架是否比开发更高即可。


3
请将文本从英语翻译成中文。仅返回翻译后的文本:请在评论部分提供非解决方案答案。 - emen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接