C# Windows 服务立即"running"而不是"start-pending"



我想编写一个Windows服务来初始化Windows启动上的硬件设备。不幸的是,初始化最多需要 10 秒。由于另一个服务依赖于它(并且如果我的服务已完成,则应启动(,因此在初始化期间应保持服务状态SERVICE_START_PENDING,并在所有完成后更改为SERVICE_RUNNING

由于我使用异步进程(带有事件(捕获数据,因此我无法在OnStart函数中进行整个处理。 根据Microsoft网站上的信息,我尝试了以下过程:

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 中阻止,直到启动实际完成。服务管理器开发良好。它应该有某种方法来处理启动时间较长的服务。它应该能够在 paralell 中启动一些其他服务,假设它们不在同一个 SVCHost 实例中运行。即使它们在同一实例中运行,实例本身也有一些多任务处理。

如有疑问,您可以编写自己的 Executeable,注册为服务。那么就不可能有内引。

2( 停止使用"挂起"来传达状态。通常,如果要与本地服务通信,可以通过在 LoopbackIP 地址发送网络包来交谈。或者使用管道(做一些同样的事情(。

只需修改"提供服务",使其可以告诉"我在这里,但尚未准备好处理"。如果内部启动完成,它将停止说。

相关内容

最新更新