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

Windows服务运行正常但停止后报1053错误:是否与async/await有关?

Windows服务1053错误排查与修复

核心问题分析

你遇到的1053错误(服务未及时响应启动/控制请求),根源在于OnStop方法的异步处理方式错误,以及取消逻辑的不完善:

  1. OnStop阻塞控制线程
    你的OnStop用Task.Run(async () => await StopServiceAsync()).Wait()包装异步操作并同步等待,这会直接阻塞Windows服务的控制线程。Windows要求OnStop必须在默认30秒内返回,一旦Wait()等待的操作超时,就会触发1053错误。

  2. 取消逻辑不严谨
    StopServiceAsync仅调用_cts.Cancel()后固定延迟1秒,但没有实际等待后台的RunEmailProcessingLoop任务完成。如果循环未及时响应取消信号,服务无法真正停止,下次启动时可能因资源占用或状态异常触发错误。

  3. OnStart的任务管理缺失
    OnStart用Task.Run启动异步任务但未保存任务引用,无法在OnStop时跟踪并等待任务完成,也无法处理任务异常。

修复步骤

1. 重构OnStart/OnStop方法

修改服务类,添加类级别的任务变量来跟踪后台服务任务:

private Task _serviceTask;
private readonly CancellationTokenSource _cts = new CancellationTokenSource();

protected override void OnStart(string[] args)
{
    LogTs.LogInfo("Running OnStart().");
    // 直接启动异步任务并保存引用,无需Task.Run包装
    _serviceTask = StartServiceAsync();
}

protected override void OnStop()
{
    LogTs.LogInfo("Running OnStop().");
    
    // 触发取消信号
    _cts.Cancel();
    
    try
    {
        // 等待后台任务完成,设置30秒超时(匹配Windows服务默认超时)
        if (_serviceTask != null && !_serviceTask.Wait(TimeSpan.FromSeconds(30)))
        {
            LogTs.LogWarn("服务停止超时,强制终止");
        }
    }
    catch (AggregateException ex)
    {
        // 过滤取消异常,记录其他错误
        var nonCancelExceptions = ex.Flatten().InnerExceptions.Where(e => !(e is OperationCanceledException));
        if (nonCancelExceptions.Any())
        {
            LogTs.LogError("停止服务时发生错误", nonCancelExceptions.First());
        }
        else
        {
            LogTs.LogInfo("服务已正常取消");
        }
    }
    finally
    {
        _cts.Dispose();
    }
}

2. 完善RunEmailProcessingLoop的取消响应

确保循环逻辑每次迭代都检查取消信号,或在异步操作中传入CancellationToken:

private async Task RunEmailProcessingLoop(CancellationToken token)
{
    while (!token.IsCancellationRequested)
    {
        try
        {
            // 处理邮件逻辑,传入token支持取消
            await ProcessEmailsAsync(token);
            
            // 循环间隔,同样支持取消
            await Task.Delay(TimeSpan.FromMinutes(5), token);
        }
        catch (OperationCanceledException)
        {
            // 捕获取消异常,退出循环
            LogTs.LogInfo("邮件处理循环已取消");
            break;
        }
        catch (Exception ex)
        {
            LogTs.LogError("邮件处理出错", ex);
            // 出错后短暂延迟再重试,避免频繁报错
            await Task.Delay(TimeSpan.FromSeconds(30), token);
        }
    }
}

3. 移除冗余的StopServiceAsync方法

原来的StopServiceAsync仅做取消和固定延迟,逻辑可以合并到OnStop中,无需单独封装。

额外排查方向

  • 检查RunEmailProcessingLoop中是否有同步阻塞操作:如果存在长时间同步代码,会导致任务无法及时响应取消信号,延长停止时间。
  • 查看系统日志:在事件查看器的「Windows日志>应用程序」中查找服务相关的错误日志,可能有更详细的异常信息。
  • 测试服务停止流程:手动停止服务后,检查进程是否完全退出(通过任务管理器查看服务对应的exe进程),若未退出说明后台任务未正确终止。

内容的提问来源于stack exchange,提问作者edgar_is

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:05:17