C# Windows 立即服务 "running" 而不是 "start-pending"
C# Windows service immediately "running" instead of "start-pending"
我想编写一个 Windows 服务来在 Windows 启动时初始化硬件设备。不幸的是,初始化最多需要 10 秒。由于另一个服务依赖于它(如果我的服务已经完成,它应该刚刚开始)服务状态应该在初始化期间保持SERVICE_START_PENDING
并在所有完成后更改为SERVICE_RUNNING
。
由于我正在使用异步进程(带有事件)捕获数据,因此我无法在OnStart
函数中完成整个处理过程。
根据 Microsoft website 中的信息,我尝试了以下程序:
protected override void OnStart(string[] args)
{
ServiceStatus serviceStatus = new ServiceStatus();
serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING;
serviceStatus.dwWaitHint = 100000;
serviceStatus.dwControlsAccepted = 0x00000000; // none
serviceStatus.dwCheckPoint= 1; // Initialize checkpoint
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
/* Starting the asynchronous processes */
}
void OutputDataReceived_Event(object sender, DataReceivedEventArgs e)
{
ServiceStatus serviceStatus = new ServiceStatus();
serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING;
serviceStatus.dwControlsAccepted = 0x00000000;
serviceStatus.dwCheckPoint++; // Increment checkpoint
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
/* Do initialization things */
/* Call "InitializationDone()" if all was done */
}
void InitializationDone()
{
ServiceStatus serviceStatus = new ServiceStatus();
serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;
serviceStatus.dwControlsAccepted = 0x00000001; // SERVICE_ACCEPT_STOP
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
}
但是,服务控制管理器在执行OnStart
方法后立即将我的服务指示为SERVICE_RUNNING
,这导致过早启动相关服务. 如何延迟服务状态SERVICE_RUNNING
?
我已经在那个主题上花了很多时间但没有成功!!
我看到了两种解决方法:
1) 阻塞在OnStart中,直到真正启动完成。服务经理很发达。它应该有一些方法来处理启动时间长的服务。它应该能够并行启动一些其他服务,假设它们不在同一个 SVCHost 实例中 运行。即使他们 运行 在同一个实例中,实例本身也有一些多任务处理。
如有疑问,您可以编写自己的可执行文件并将其注册为服务。那么应该不会有任何干扰。
2) 停止使用 Pending 来传达状态。通常,如果您想与本地服务通话,您可以通过在 LoopbackIP 地址发送网络包来通话。或者使用管道(至于做同样的事情)。
只需修改提供服务,使其可以告诉 "I am here, but not yet ready to process"。如果它的内部启动完成,它将停止说些什么。
我想编写一个 Windows 服务来在 Windows 启动时初始化硬件设备。不幸的是,初始化最多需要 10 秒。由于另一个服务依赖于它(如果我的服务已经完成,它应该刚刚开始)服务状态应该在初始化期间保持SERVICE_START_PENDING
并在所有完成后更改为SERVICE_RUNNING
。
由于我正在使用异步进程(带有事件)捕获数据,因此我无法在OnStart
函数中完成整个处理过程。
根据 Microsoft website 中的信息,我尝试了以下程序:
protected override void OnStart(string[] args)
{
ServiceStatus serviceStatus = new ServiceStatus();
serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING;
serviceStatus.dwWaitHint = 100000;
serviceStatus.dwControlsAccepted = 0x00000000; // none
serviceStatus.dwCheckPoint= 1; // Initialize checkpoint
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
/* Starting the asynchronous processes */
}
void OutputDataReceived_Event(object sender, DataReceivedEventArgs e)
{
ServiceStatus serviceStatus = new ServiceStatus();
serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING;
serviceStatus.dwControlsAccepted = 0x00000000;
serviceStatus.dwCheckPoint++; // Increment checkpoint
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
/* Do initialization things */
/* Call "InitializationDone()" if all was done */
}
void InitializationDone()
{
ServiceStatus serviceStatus = new ServiceStatus();
serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;
serviceStatus.dwControlsAccepted = 0x00000001; // SERVICE_ACCEPT_STOP
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
}
但是,服务控制管理器在执行OnStart
方法后立即将我的服务指示为SERVICE_RUNNING
,这导致过早启动相关服务. 如何延迟服务状态SERVICE_RUNNING
?
我已经在那个主题上花了很多时间但没有成功!!
我看到了两种解决方法:
1) 阻塞在OnStart中,直到真正启动完成。服务经理很发达。它应该有一些方法来处理启动时间长的服务。它应该能够并行启动一些其他服务,假设它们不在同一个 SVCHost 实例中 运行。即使他们 运行 在同一个实例中,实例本身也有一些多任务处理。
如有疑问,您可以编写自己的可执行文件并将其注册为服务。那么应该不会有任何干扰。
2) 停止使用 Pending 来传达状态。通常,如果您想与本地服务通话,您可以通过在 LoopbackIP 地址发送网络包来通话。或者使用管道(至于做同样的事情)。
只需修改提供服务,使其可以告诉 "I am here, but not yet ready to process"。如果它的内部启动完成,它将停止说些什么。