.NET Windows服务表示即使我知道它正在运行,也没有响应

时间:2011-04-28 14:12:41

标签: .net service

我有一个安装了installutil.exe的.NET 2.0 Windows服务。该服务的功能是批处理服务,该服务遍历输入文件并处理每个记录并保存输出文件。当我在Windows服务中启动该服务时,20秒后它表示该服务没有响应,因此它停止服务,但是我可以从输出文件中看到该服务正常运行。 我收到的确切消息是:错误1053:服务没有及时响应启动或控制请求。

我使用注册表黑客增加了Windows服务超时,但它产生了相同的结果(唯一的区别是接收“无响应”消息需要更长的时间)。

我的服务的OnStart方法如下所示:

protected override void OnStart(string[] args)
{ 
     Producer producer = new Producer();
     ThreadStart st = new ThreadStart(producer.Produce); 
     workerThread = new Thread(st); 
     workerThread.Start();
}

static void Main()  
{
     System.ServiceProcess.ServiceBase[] ServicesToRun;
     ServicesToRun = new System.ServiceProcess.ServiceBase[] { new BatchService() }; 
     System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
}

Producer构造函数:

public Producer()
{
     nMaxConcurentJobs =   int.Parse(ConfigurationManager.AppSettings["MaxConcurentJobs"]); 
     if (ConfigurationManager.AppSettings[TIME_INTERVAL] != null)`  
     {
          sleepTime = int.Parse(ConfigurationManager.AppSettings[TIME_INTERVAL]);
          sleepTime *= 1000;
     } 
}

我需要通知Windows服务它的工作吗?任何帮助都会受到赞赏,我已经好好忍受了好几天了!

2 个答案:

答案 0 :(得分:1)

通过让OnStart进行某种日志输出来确保调用RequestAdditionalTime

确保您在ServiceBase - 派生类构造函数中没有做很多工作,OnStart是进行繁重工作的地方。

如果您的启动逻辑持久,您可能需要调用{{3}}来阻止服务控制管理器(SCM)假设您的进程已经死亡。当您从OnStart返回时,SCM会在服务GUI中将您的服务标记为“正在运行”。

设计您的应用程序,使其不作为服务运行,以确保您在多线程启动代码中没有死锁。将适当的诊断输出添加到该逻辑以跟踪其进度。

答案 1 :(得分:0)

我在任何地方都看不到有关Producer.Produce()的任何详细信息,但我确实注意到似乎是名为sleepTime的成员。你在使用Thread.Sleep()吗?如果是,您是否尝试过使用MonitorTimer