【问题标题】:C# Windows service immediately "running" instead of "start-pending"C# Windows 服务立即“运行”而不是“启动挂起”
【发布时间】:2018-10-20 10:39:00
【问题描述】:

我想编写一个 Windows 服务来在 Windows Boot 上初始化一个硬件设备。不幸的是,初始化最多需要 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

我已经在那个话题上花费了很多小时但没有成功!!

【问题讨论】:

    标签: c# windows asynchronous process windows-services


    【解决方案1】:

    我看到了两种解决方法:

    1) 在 OnStart 中阻塞,直到启动实际完成。服务经理很发达。它应该有一些方法来处理启动时间很长的服务。它应该能够并行启动一些其他服务,假设它们不在同一个 SVCHost 实例中运行。即使它们在同一个实例中运行,实例本身也有一些多任务处理。

    如果有疑问,您可以编写自己的可执行文件,将其注册为服务。那么应该不可能有相互参照。

    2) 停止使用 Pending 来传达状态。通常,如果您想与本地服务通信,您可以通过在 LoopbackIP 地址发送网络包来进行通信。或者使用管道(几乎做同样的事情)。

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

    【讨论】:

    • 我需要挂起,因为其他服务是专有的,无法更改。这就是它依赖我的服务的原因!
    • @AustriaBen 然后是选项 1:在开始工作实际完成之前不要让 OnStart 返回。
    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多