5

我有一个将文件导入数据库的 Windows 服务。当 Service 收到停止通知时,它应该尽可能完成当前的 Import。可能需要几分钟才能完成。
因此,我使用该ServiceBase.RequestAdditionalTime方法向 SCM 发出服务仍在工作和可操作的信号。

protected override void OnStop()
{
   var waitTime = TimeSpan.FromSeconds(5);
   var additionalWaitTime = TimeSpan.FromMinutes(3);

   Trace.Write("Stopping service...");

   var task = Task.Factory.StartNew(() => worker.Stop());
   while (!task.Wait(waitTime))
   {
     Trace.Write("Requesting additional time...");

     RequestAdditionalTime((int)additionalWaitTime.TotalMilliseconds);

     Trace.Write("Waiting for {1} to complete...");
   }

   Trace.Write("Service stopped.");
}

在测试时,我找不到使用该RequestAdditionalTime方法的服务的任何不同行为。如果我删除RequestAdditionalTime呼叫,服务的行为方式相同:

  • 在服务停止时,SCM 等待大约 2 分钟并报告服务没有响应(错误 1053)。之后,服务状态一直保持Stopping到我的工作人员完成。
  • 关机时,系统不会等待额外的时间。它似乎在 5 秒后杀死了所有服务(注册表项WaitToKillServiceTimeout

问题

有什么作用RequestAdditionalTime?使用它时我应该在哪里看到不同之处以及如何测试它?有几次我读到如果没有额外的时间请求,SCM 将终止服务。但我看不到这种行为。

在我的本地开发机器(Win 8.1)上运行的所有测试,假设行为与在 Windows Server 操作系统上的行为相同。

4

0 回答 0