我有一个在 IIS 中运行的 Web 应用程序,并通过托管在同一台计算机上的 WCF 与 Windows 服务进行通信。Windows 服务在内部执行各种工作,有时它非常忙于处理用户请求。一开始我遇到了服务启动的问题,因为有些时间需要很长时间才能启动并最终引发错误,即服务超时。为了解决这个问题,我将代码移动到另一个线程而不是主线程。一切正常,但现在我观察到有时我在服务停止时遇到错误,即
**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 服务中的超时问题而发生的,因为默认时间非常短,并且将其视为超时。
我的问题是避免这种瓶颈的最佳做法是什么意味着我应该将我的 Stop 相关任务移到另一个线程下并进行异步调用以释放该线程中的资源。但是,如果在释放资源期间,用户将启动服务会发生什么?