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


我有一个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();

它将“启动服务”和“运行...”打印到日志文件中。我也剥离了MyService的内部,所以它是空的。在任何代码周围都有一个try / catch,现在可以简化为上面的一些日志行。我从未输入将记录它的catch语句。

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

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

所以我基本上没有想法。我认为错误是因为Start方法永远不会完成(或者不会在30秒内完成)。是否有其他方法被调用?任何想法都表示赞赏。

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


2087
2017-09-13 13:20


起源

确保捕获所有未处理的异常并将其写入日志。例如: stackoverflow.com/questions/58280/... ...这可能会为您提供有关其失败原因的更多信息。 - Christophe Geers


答案:


你错过了 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:
    }
}

并将以下try / catch添加到OnStart,因为.NET / SCM吞下异常:

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

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

14
2017-09-13 13:35



此外,如果要调试服务初始化,可以在初始化代码中调用System.Diagnostics.Debugger.Break()。当达到此行时,Windows将询问您是否要启动调试器,这将使您能够从该点调试服务。 - Polyfun
谢谢。 ServiceBase.Run(servicesToRun); line在此过程中被注释掉了。 - Kasper Hansen
对我来说,调试条件集是在没有调用的情况下运行的 ServiceBase.Run(serviceToRun); - absynce
经过多次回答,这就是那个
这在我的案例中起作用,帮助我的队友即将去MAD。非常感谢!!! - Aimal Khan