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注册表项指定的内容).
它在子项的注册表中设置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
Run Code Online (Sandbox Code Playgroud)
具有字符串值WaitToKillServiceTimeout
.如果未定义,则默认为20000(ms).在我的机器上似乎设置为12000(12s).我从未碰过它.
归档时间: |
|
查看次数: |
24250 次 |
最近记录: |