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

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

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

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

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

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

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

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

虽然有很多人提到了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注册表项指定的内容)。

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

  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control 

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

默认情况下我认为它是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); 

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