对于测试,我需要一个停止 10-15 分钟的服务。
我创建了我最简单的 Win 服务:
using System;
using System.Diagnostics;
using System.ServiceProcess;
namespace LongService
{
public class LongService : ServiceBase
{
private EventLog eventLog1;
public const string MyServiceName = "LongService";
public const string logName = "LongServiceLog";
public LongService()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.ServiceName = MyServiceName;
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
protected override void OnStart(string[] args)
{
AddLog("start");
}
protected override void OnStop()
{
AddLog("stop");
Process.GetCurrentProcess().WaitForExit(600000);
}
public void AddLog(string log)
{
try
{
if (!EventLog.SourceExists(MyServiceName))
{
EventLog.CreateEventSource(MyServiceName, logName);
}
eventLog1 = new System.Diagnostics.EventLog();
eventLog1.Source = MyServiceName;
eventLog1.Log = logName;
eventLog1.WriteEntry(log);
}
catch{}
}
}
}
问题:如何在服务本身超时的情况下正确推迟(延迟)服务的停止
Process.GetCurrentProcess().WaitForExit(600000);
或者如何在注册表中增加 Windows 的超时时间。因为 在 Windows 中等待服务停止不超过 2 分钟。2 分钟后 Windows 抛出错误
- 该服务没有及时响应请求。
他们写道ServiceBase.RequestAdditionalTime 可以提供帮助。
在 OnStop/OnStart/OnContinue/OnPause 中添加口味。
我没有检查配方,操作系统中可能存在限制额外时间的设置。
是的,这里是:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control 中的 ServicesPipeTimeout
PS 而且我不知道你在测试什么,但同样的主题非常正确地表明你需要在启动/停止服务时将长的东西放入一个单独的线程中。
好吧,让他扔掉吧。服务被发送停止命令,服务在等待期间没有停止。Windows 发出警告并忘记了此服务。您的 10-15 分钟将过去,服务将正常停止
停止时,服务会经历状态
SERVICE_RUNNING
-SERVICE_STOP_PENDING
-SERVICE_STOPPED
。PENDING 状态可以挂起任意长的时间。功能在使用依赖服务时开始。例如,如果它SERVICE_START_PENDING
挂起的时间超过相同的 2 分钟,则依赖于它的服务不会启动