C# Windows服务启动超时触发1053错误求助
问题原因与解决方案
核心问题:服务启动超时(1053错误)
Windows服务要求OnStart方法必须在30秒内完成返回,系统才会判定服务启动成功。你的代码里OnStart直接调用了StartSpPushOperation,而这个方法里包含无限while(true)循环,导致OnStart永远无法返回,触发系统的启动超时检测,抛出1053错误——哪怕你的后台逻辑已经在运行并写入日志,系统仍会判定启动失败。
修复方案:将业务逻辑移到后台线程
把无限循环的业务逻辑放到独立的后台线程中,让OnStart能快速返回,完成系统的启动校验。同时要实现安全的停止逻辑,避免线程无法终止。
修改后的代码示例
1. Service1.cs(服务类)
public partial class spService: ServiceBase { private SpPushOperation _spo; private Thread _workerThread; public spService() { InitializeComponent(); _spo = new SpPushOperation(); } protected override void OnStart(string[] args) { // 启动后台线程执行业务逻辑 _workerThread = new Thread(_spo.StartSpPushOperation); _workerThread.IsBackground = true; // 设置为后台线程,服务停止时自动终止 _workerThread.Start(); } protected override void OnStop() { // 通知业务逻辑停止循环 _spo.StopSpPushOperation(); // 等待线程终止(可选,根据业务需求设置超时) if (_workerThread != null && _workerThread.IsAlive) { _workerThread.Join(TimeSpan.FromSeconds(10)); } } }
2. SpPushOperation.cs(业务逻辑类)
添加线程安全的停止标识,让无限循环能优雅终止:
class SpPushOperation { public readonly NLog.ILogger Logger = NLog.LogManager.GetCurrentClassLogger(); private volatile bool _isRunning = false; // volatile保证多线程下的可见性 public void StartSpPushOperation() { try { Logger.Info("-------------"); Logger.Info("SpPushOperation Started.."); Logger.Info("-------------"); _isRunning = true; while(_isRunning) { // 你的业务处理逻辑 // 建议添加适当的延迟,避免CPU占用过高 Thread.Sleep(1000); // 示例:每秒执行一次 } Logger.Info("-------------"); Logger.Info("SpPushOperation Stopped.."); Logger.Info("-------------"); } catch(Exception e) { Logger.Info("!!!!!!!!!!!!!!"); Logger.Info("Error in StartSpPushOperation: " + e); Logger.Info("!!!!!!!!!!!!!!"); } } public void StopSpPushOperation() { _isRunning = false; Logger.Info("Received stop signal for SpPushOperation"); } }
额外注意事项
- CPU占用优化:如果业务逻辑不需要高频执行,在循环内添加
Thread.Sleep()或使用定时器(如System.Timers.Timer),避免线程持续占用CPU。 - 异常处理:确保业务逻辑中的异常不会导致后台线程崩溃,必要时在循环内添加try-catch。
- 线程安全:如果业务逻辑涉及共享资源,要使用锁或其他线程同步机制保证数据安全。
- 事件查看器消息:你看到的"Session 1 started"等消息大概率和本次超时问题无关,重点还是解决
OnStart的阻塞问题。
内容的提问来源于stack exchange,提问作者seneill
相关产品推荐
相关产品推荐

