servicio de Windows en C # inmediato "corriendo" en lugar de "puesta en pendiente"

votos
0

Quiero escribir un servicio de Windows para inicializar un dispositivo de hardware en el arranque de Windows. Por desgracia, la inicialización necesita un máximo de 10 segundos. Desde otro servicio depende de él (y sólo debe iniciar si mi servicio ha sido terminado) el estado del servicio se debe a cabo el SERVICE_START_PENDINGdurante la inicialización y cambiar a SERVICE_RUNNINGdespués de todo estaba hecho.

Debido al hecho de que estoy capturando los datos mediante el uso de procesos asíncronos (eventos), no puedo hacer todo el procesamiento de la OnStartfunción. Sobre la base de la información de la página web de Microsoft que probé el siguiente procedimiento:

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

Sin embargo, el Administrador de control de servicios indica inmediatamente mi servicio como SERVICE_RUNNINGdespués de que el OnStartmétodo ha sido ejecutado, que causan a iniciar el servicio dependiendo demasiado pronto . ¿Cómo puedo retrasar el estado del servicio SERVICE_RUNNING?

Ya pasé muchas horas en ese tema sin éxito !!

Publicado el 20/10/2018 a las 10:39
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Veo dos maneras de evitar esto:

1) Bloquear en OnStart hasta que el inicio es en realidad terminó. El jefe de servicio está bien desarrollada. Se debe tener alguna manera de hacer frente a los servicios que tienen un largo tiempo de arranque. Debe ser capaz de iniciar otros servicios en paralelo, Asumiendo que no se ejecutan en la misma instancia SVCHOST. E incluso si se encuentran en la misma instancia, la instancia de sí mismos tienen algún multitarea.

Y en caso de duda, puede simplemente escribir su propio ejecutable que se registra como un serivce. Entonces no intereference debería ser posible.

2) Deje de usar Pendiente para comunicar el estado. Por lo general, si desea hablar con un servicio local, se habla mediante el envío de paquetes de red en el LoopbackIP Dirección. O utilizar tuberías (wich hacer un poco la misma cosa).

Basta con modificar la prestación de servicios por lo que puede decir "yo estoy aquí, pero aún no está listo para procesar". Algo que va a dejar de decir si es el inicio interno es completa.

Respondida el 20/10/2018 a las 12:28
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more