.net 在使用ServiceBase时,如何使服务缓慢启动而不使其无法阻止?

.net 在使用ServiceBase时,如何使服务缓慢启动而不使其无法阻止?,.net,service,.net,Service,当我使用一个具有长启动过程或等待某个外部事件的服务时,我希望该服务在任务管理器中显示为“正在启动”,直到它达到某个稳定/运行状态,此时我希望它显示为“正在运行”。为此,在我的服务达到所需状态之前,我需要避免从返回,因为一旦该方法返回,服务将更新为“正在运行”。我正在Windows 2004(build 19041.928)上的.netfx-4.8中使用以下模式执行此操作: 使用系统; 使用System.ServiceProcess; 使用System.Threading.Tasks; 命名空间服

当我使用一个具有长启动过程或等待某个外部事件的服务时,我希望该服务在任务管理器中显示为“正在启动”,直到它达到某个稳定/运行状态,此时我希望它显示为“正在运行”。为此,在我的服务达到所需状态之前,我需要避免从返回,因为一旦该方法返回,服务将更新为“正在运行”。我正在Windows 2004(build 19041.928)上的.netfx-4.8中使用以下模式执行此操作:

使用系统;
使用System.ServiceProcess;
使用System.Threading.Tasks;
命名空间服务播放
{
班级服务游戏
:ServiceBase
{
静态void Main(字符串[]参数)
{
运行(新ServicePlay());
}
启动时受保护的覆盖无效(
字符串[]args)
{
base.OnStart(args);
OnStartAsync(args.GetAwaiter().GetResult();
}
受保护的虚拟异步任务OnStartAsync(
字符串[]args)
{
等待任务延迟(时间跨度从秒(8));
}
受保护的覆盖void OnStop()
{
base.OnStop();
OnStopAsync().GetAwaiter().GetResult();
}
受保护的虚拟异步任务OnStopAsync()
{
等待任务延迟(时间跨度从秒(3));
}
}
}
我已使用
SC
注册了该服务:

>SC create ServicePlay binPath= %CD%\bin\Debug\ServicePlay.exe
[SC] CreateService SUCCESS
这使我可以通过任务管理器/服务启动和停止服务。现在,我可以看到服务的状态是“启动”的,直到我的初始化代码运行。但是,现在我也可以尝试在服务启动时停止服务。如果我这样做,停止请求将“成功”,但一旦我的
OnStart()
返回,服务仍将转换为“运行”。但是,在我尝试停止服务后,任何进一步尝试停止服务的行为都会导致错误:

无法停止服务

无法完成该操作

服务此时无法接受控制消息

专家建议,等待一段时间应该可以解决问题。然而,似乎在服务启动之前,我试图停止服务,而造成的任何混乱,即使我等待几分钟,也不会自行恢复

在尝试使
OnStart()
长时间运行时,是否缺少某些内容?即使
OnStart()
仍然没有返回,我是否需要处理停止请求,然后在该场景中避免从
OnStart()
返回

编辑:我尝试添加日志记录,以查看如果我尝试在服务运行之前停止服务,是否会发生任何事情。似乎
ServiceBase
不会调用
OnStop()
,即使我试图在
OnStart()
返回之前停止服务。这就像
ServiceBase
试图对我隐藏复杂性,但同时它引入了一种方法,使我无法恢复到不一致的状态。要正确执行此操作,我是否需要自己重新实现
ServiceBase