Windows服务运行正常但停止后报1053错误:是否与async/await有关?
Windows服务1053错误排查与修复
核心问题分析
你遇到的1053错误(服务未及时响应启动/控制请求),根源在于OnStop方法的异步处理方式错误,以及取消逻辑的不完善:
OnStop阻塞控制线程
你的OnStop用Task.Run(async () => await StopServiceAsync()).Wait()包装异步操作并同步等待,这会直接阻塞Windows服务的控制线程。Windows要求OnStop必须在默认30秒内返回,一旦Wait()等待的操作超时,就会触发1053错误。取消逻辑不严谨
StopServiceAsync仅调用_cts.Cancel()后固定延迟1秒,但没有实际等待后台的RunEmailProcessingLoop任务完成。如果循环未及时响应取消信号,服务无法真正停止,下次启动时可能因资源占用或状态异常触发错误。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
相关产品推荐
相关产品推荐

