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:
System.ServiceProcess.ServiceBase: puede reemplazar los métodos de la clase ServiceBase cuando crea un servicio y define el código para determinar cómo funciona el servicio en esta clase heredada.
System.ServiceProcess.ServiceProcessInstaller y System.ServiceProcess.ServiceInstaller: utilice estas clases para instalar y desinstalar el servicio.
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 entrue
, se pueden llamar a los métodos OnPause y OnContinue. Cuando configure una de estas propiedades entrue
, deberá reemplazar y definir el procesamiento para los métodos asociados.
También puede utilizar un componente llamado ServiceController para comunicarse con un servicio existente y controlar su comportamiento.