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

Imr*_*zvi 18 .net c# windows-services

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

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

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

我搜索但没有找到此默认停止超时值.

Imr*_*zvi 32

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

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

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


Chr*_*ine 23

虽然许多人提到了HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout注册表项,但根据Microsoft的"服务控制处理程序"文章,注册表项控制服务在关闭或重新启动Windows时关闭的最长时间:

<...>以防止服务停止关闭,服务控制器等待的时间有限.如果通过"服务"管理单元关闭服务,则限制为125秒.如果操作系统正在重新启动,则在WaitToKillServiceTimeout值<...>中指定时间限制

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

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

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

据推测,这是因为应用程序不能任意延迟超出默认值的关闭(或管理员通过WaitToKillServiceTimeout注册表项指定的内容).


spe*_*der 5

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

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
Run Code Online (Sandbox Code Playgroud)

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