我在c#中编写了一个处理大量数据的Windows服务。当我们停止它时尝试20/30秒,然后抛出异常。
我想在OnStop事件中实现ServiceBase.RequestAdditionalTime()。
我想知道Windows服务抛出异常之后的确切超时,以便我可以在它之前请求额外的时间。
我搜索但未找到此默认停止超时值。
答案 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
,即您希望服务停机所需的最长时间。比预期更早完成并不是错误。