【问题标题】:.NET Windows Service says not responding even though I know it's running.NET Windows 服务说没有响应,即使我知道它正在运行
【发布时间】:2011-08-14 18:26:43
【问题描述】:

我有一个使用 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); 
}

生产者构造函数:

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

我需要通知 Windows 服务它正在工作吗?任何帮助将不胜感激,我已经为此苦苦挣扎了好几天!

【问题讨论】:

  • 您能否也发布您的MainProducer 构造函数?
  • 我没有看到罪魁祸首,我建议按照@Steve Townsend 的建议发布BatchService 的构造函数。你在不应该的地方进行了一些繁重的工作,只需要找到它。

标签: .net service


【解决方案1】:

确保OnStart 被调用,方法是让它进行某种日志输出。

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

如果您的启动逻辑是持久的,您可能必须调用 RequestAdditionalTime 以防止服务控制管理器 (SCM) 假设您的进程已死亡。当您从OnStart 返回时,SCM 将在服务 GUI 中将您的服务标记为“正在运行”。

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

【讨论】:

  • 我有日志文件,它显示一切正常。我发布了我的 OnStart 方法,如您所见,它所做的只是创建一个新线程。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多