我正在尝试调试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方法似乎必须退出(没有错误)。
答案 0 :(得分: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:
}
}
并将以下try / catch添加到OnStart,因为.NET / SCM吞下了异常:
protected override void OnStart(String[] args) {
try {
} catch(Exception e) {
// log exception:
throw;
}
}
答案 1 :(得分:0)
尽管此线程很旧,这里还是我的附加答案,因为它可能会帮助我节省一些时间的其他时间:
情况
用C#编写的Windows服务可以监视目录,并将已解析的消息从文件发布到MQTT主题,并且可以在Win10上运行良好,也可以在家用WinXP上进行简短测试期间运行
在生产环境中,服务在Win10上运行良好,在WinXP上经过几个小时后崩溃,并且无法重新启动(无法在本地计算机上启动filemqttservice服务。错误1053:服务未响应及时启动或控制请求)
解决方案
清除事件日志历史记录! (Doh!)我的服务太客气了,无法在几个小时内填满事件日志缓冲区。清除事件日志后,该服务再次启动。当然,我从服务中删除了所有产生消息的行
答案 2 :(得分:0)
只需检查.net框架的两侧都应该相同,或者在安装方面,服务器场应比开发版本高