1053 windows服务没有及时响应

时间:2013-03-11 12:40:30

标签: c# windows service

我在IIS中运行了一个Web应用程序,并通过托管在同一台计算机上的WCF与Windows服务进行通信。内部Windows服务执行各种作业,有时它非常忙于处理用户请求。在第一天,我遇到了服务开始的问题,因为它有一些时间需要很长时间才能开始使用。最终抛出错误即服务超时。为了解决这个问题,我将代码移到另一个Thread而不是Main Thread。一切正常,但现在我发现有时我收到服务停止错误,即

**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相关任务移到另一个Thread&进行异步调用以释放该Thread中的资源。但是如果在发布资源期间,用户将启动服务会发生什么?

3 个答案:

答案 0 :(得分:1)

猜测,但也许它有助于追踪问题:

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

如果你在这里进行异步处理,你可以使用.NET-Framework中的CancellationTokens来实现CancellationPattern。

答案 1 :(得分:1)

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

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

但是,你有不同的线程完成流程可能超过30秒,但你也可以通过应用中止你的流程

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

myScheduleManager.Stop();

但是,我没有看到完整的代码片段,所以这是我对你的场景的猜测。

答案 2 :(得分:1)

只是猜测但它可能有所帮助:确保将解决方案配置设置为Release而不是Debug。