You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:21:27