1053 windows服务没有及时回应

我有一个Web应用程序在IIS中运行,并通过在同一台机器上托pipe的WCF与Windows服务通信。 内部Windows服务执行各种工作,有时处理用户请求时相当繁忙。 在1日,我遇到了服务启动的问题,因为有些imes需要花费很多时间来启动并最终抛出错误,即服务超时。 为了解决这个问题,我将代码移到了另一个线程而不是主线程。 一切工作正常,但现在我观察到,有些时候我得到服务停止错误即

**1053 windows service did not respond in timely fashion** 

我的服务OnStop()代码:

 protected override void OnStop() { // Stop the WCF service if (myServiceHost != null) { myServiceHost.Close(); myServiceHost = null; } // Stop the scheduler if (myScheduleManager != null) { myScheduleManager.Stop(); } // Update the registry value Logger.GetInstance().LogEvent(this.GetType().Name, LogLevel.INFO, "Updating registry..."); Settings.GetInstance().LastStopTime = DateTime.Now.ToString(); Logger.GetInstance().LogEvent(this.GetType().Name, LogLevel.INFO, "Service stopped."); } 

这通常发生在服务太忙的时候。 但最后在30-40分钟后停止。 我知道这是由于在Windows服务中的超时问题,因为默认时间非常less,它把它视为超时。

我的问题避免这种瓶颈的最佳做法是什么意思是我应该将我的停止相关任务移动到另一个线程下,并执行asynchronous调用以释放该线程中的资源。 但是,如果在发布资源期间会发生什么,用户将启动服务?

只是猜测,但也许这将有助于追查问题:

你有这个myScheduleManager.Stop()哪,(我猜)等待进程完成。 这很好,但是Windows只给你30秒来执行ServiceBase.OnStop()

如果您在此处进行异步处理,则可以使用.NET-Framework中的CancellationToken来实现CancellationPattern。

简单的方法可能可以确定在myScheduleManager中构建布尔类型IsRunning ,并在OnStop()

 if (myScheduleManager.IsRunning) myScheduleManager.Stop(); 

然而,你有不同的线程完成可能超过30秒的过程,但你也可以通过申请中止你的过程

 if (myScheduleManager.IsRunning && !_workerThread.Join(TimeSpan.FromSeconds(30)) _workerThread.Abort myScheduleManager.Stop(); 

然而,我没有看到完整的代码片段,所以这是我的猜测你的情况。

只是一个猜测,但它可能会有所帮助:确保您的解决方案配置设置为释放,而不是调试。