C#Windows服务立即“运行”,而不是“开始挂起”

时间:2018-10-20 10:39:01

标签: c# windows asynchronous process windows-services

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

由于我使用异步进程(带有事件)来捕获数据,因此无法使用OnStart函数进行整个处理。 根据{{​​3}}的信息,我尝试了以下过程:

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);
}

但是,在执行SERVICE_RUNNING方法之后,服务控制管理器会立即将我的服务指示为OnStart,这会导致过早启动依赖服务如何延迟服务状态SERVICE_RUNNING

我已经在这个话题上花了很多时间而没有成功!

1 个答案:

答案 0 :(得分:0)

我看到了两种解决方法:

1)阻止OnStart,直到实际完成启动为止。服务经理很发达。它应该有某种方式来处理启动时间较长的服务。假定它们不在同一SVCHost实例中运行,它应该能够在paralell中启动其他服务。即使它们在同一实例中运行,该实例本身也具有一些多任务处理。

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

2)停止使用“挂起”来传达状态。通常,如果您想与本地服务通话,可以通过在LoopbackIP地址发送网络数据包进行通话。或使用管道(可以做一些相同的事情)。

只需修改提供服务,以便它可以告诉“我在这里,但尚未准备好处理”。它会停止说出它的内部启动是否完成。