Compartir a través de


Arquitectura de programación de aplicaciones de servicio

Nota:

Este artículo no se aplica a servicios hospedados en .NET. Para el contenido más reciente sobre los servicios de Windows que utilizan Microsoft.Extensions.Hosting.BackgroundService y la plantilla del servicio de trabajo, consulte:

Las aplicaciones de servicios de Windows se basan en una clase que hereda de la clase System.ServiceProcess.ServiceBase. Se sustituyen los métodos de esta clase y se define la funcionalidad para que determinen el comportamiento del servicio.

Las principales clases implicadas en la creación de servicios son:

Además, se puede utilizar una clase llamada ServiceController para manipular el propio servicio. Esta clase no está implicada en la creación de un servicio, pero se puede usar para iniciar y detener el servicio, pasarle comandos y devolver una serie de enumeraciones.

Definición del comportamiento del servicio

En la clase de servicio, se reemplazan las funciones de clase base que determinan lo que sucede cuando se cambia el estado del servicio en el Administrador de control de servicios. La clase ServiceBase expone los siguientes métodos, que puede reemplazar para agregar un comportamiento personalizado.

Método Reemplazar por
OnStart Indique qué acciones se deben tomar cuando el servicio comience a ejecutarse. Debe escribir código en este procedimiento para que el servicio realice un trabajo útil.
OnPause Indique lo que debería suceder cuando el servicio esté en pausa.
OnStop Indique lo que debería suceder cuando el servicio deje de funcionar.
OnContinue Indique lo que debería suceder cuando el servicio reanude su funcionamiento normal después de haber sido pausado.
OnShutdown Indique lo que debería suceder justo antes de que el sistema se apague, si el servicio se está ejecutando en ese momento.
OnCustomCommand Indique lo que debería suceder cuando el servicio recibe un comando personalizado. Para obtener más información sobre comandos personalizados, consulte MSDN Online.
OnPowerEvent Indique cómo debe responder el servicio cuando se recibe un evento de administración de energía, como una batería baja o una operación suspendida.

Nota

Estos métodos representan los estados por los que pasa el servicio durante su vigencia; el servicio pasa de un estado a otro. Por ejemplo, nunca conseguirá que el servicio responda a un comando OnContinue antes de que se haya llamado a OnStart.

Hay varias otras propiedades y métodos que son de interés. Se incluyen los siguientes:

  • El método Run en la clase ServiceBase. Este es el punto de entrada principal para el servicio. Cuando crea un servicio utilizando la plantilla de servicio de Windows, el código se inserta en el método Main de la aplicación para ejecutar el servicio. El código es similar al siguiente:

    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
        { new Service1() };
    Run(ServicesToRun);
    
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase
    ServicesToRun =
        New System.ServiceProcess.ServiceBase() {New Service1()}
    System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    

    Nota

    Estos ejemplos usan una matriz del tipo ServiceBase, en la que cada servicio que contiene la aplicación puede agregarse, y entonces todos los servicios pueden ejecutarse juntos. Sin embargo, si solo está creando un único servicio, puede optar por no usar la matriz y simplemente declarar un nuevo objeto heredado de ServiceBase y después ejecutarlo. Como ejemplo, vea Cómo: Escribir servicios mediante programación.

  • Una serie de propiedades de la clase ServiceBase. Determinan qué métodos se pueden llamar en el servicio. Por ejemplo, cuando la propiedad CanStop se establece en true, se puede llamar al método OnStop del servicio. Cuando la propiedad CanPauseAndContinue se establece en true, se pueden llamar a los métodos OnPause y OnContinue. Cuando configure una de estas propiedades en true, deberá reemplazar y definir el procesamiento para los métodos asociados.

    Nota

    El servicio debe reemplazar al menos OnStart y OnStop para ser útil.

También puede utilizar un componente llamado ServiceController para comunicarse con un servicio existente y controlar su comportamiento.

Vea también