Windows服务等待处理停止请求的最长时间是多少以及如何请求额外的时间

时间:2012-11-19 12:41:59

标签: c# .net windows-services

我在c#中编写了一个处理大量数据的Windows服务。当我们停止它时尝试20/30秒,然后抛出异常。

我想在OnStop事件中实现ServiceBase.RequestAdditionalTime()。

我想知道Windows服务抛出异常之后的确切超时,以便我可以在它之前请求额外的时间。

我搜索但未找到此默认停止超时值。

5 个答案:

答案 0 :(得分:31)

我编写了以下代码来实现它。

protected override void OnStop()
{
  int timeout = 10000;
  var task = Task.Factory.StartNew(() => MyTask());
  while (!task.Wait(timeout))
  {
      RequestAdditionalTime(timeout);
  }
}

上面的代码启动一个与主线程并行的任务(任务立即开始运行),下一行是每10秒检查一次任务是否完成,如果没有完成,它会再请求10秒并继续检查任务完成。

答案 1 :(得分:20)

虽然有很多人提到了HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout注册表项,但根据this "Service Control Handler" article from Microsoft注册表项控制服务可以关闭的最长时间当Windows本身关闭或重新启动时

  

< ...>为防止服务停止关机,有一个限制   服务控制器等待多长时间。如果服务被关闭   通过“服务”管理单元,限制为125秒。如果   操作系统正在重启,时间限制在   WaitToKillServiceTimeout值< ...>

如果Windows未处于重新启动或关闭状态,则Windows等待服务关闭的默认时间为30秒。但是,应用程序可以请求额外的时间,最多可以达到125秒(所有请求的总和)。

在Windows Server 2003及更高版本中,此默认超时可以通过HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServicesPipeTimeout注册表项更改,如this Microsoft support article(和this ServerFault question)中所述。目前尚不清楚这是否适用于Windows 7/8/10,因为该文章仅提及服务器版本。

如果已在计算机上启动重新启动/关闭,则WaitToKillServiceTimeout注册表项值(如果存在)指定Windows将允许该应用程序的最长时间,从而覆盖操作系统默认值。

据推测,这样应用程序无法任意延迟超出默认值的关闭(或管理员通过WaitToKillServiceTimeout注册表项指定的内容)。

答案 2 :(得分:5)

它在子项的注册表中设置:

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

字符串值WaitToKillServiceTimeout。如果未定义,则默认为20000(ms)。在我的机器上似乎设置为12000(12s)。我从未碰过它。

答案 3 :(得分:1)

默认情况下我认为它是12000毫秒,要更改它你需要访问注册表 HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ WaitToKillServiceTimeout并更改值

但如果您想要启动或停止编程,您可以定义自己的超时时间 在这里你定义自己的开始时间

TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);

在这里你定义了自己的停止时间

 TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
 service.Stop();
 service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

答案 4 :(得分:1)

只需始终执行RequestAdditionalTime,即您希望服务停机所需的最长时间。比预期更早完成并不是错误。