|
Introducción:
Muchas veces se necesitan hacer aplicaciones que ejecuten tareas de larga duración y que se inicien automáticamente ante determinados eventos como al encender la computadora, puedan ser pausadas, reiniciadas, carezcan de interfaz y no interfieran con los otros trabajos que realizan los usuarios en la misma computadora. Tales aplicaciones se conocen formalmente en el mundo Windows como Servicios Windows y son idóneas cuando se desea implementar agentes que trabajen en background y realicen tareas de rutina de forma periódica o que traten con carga de trabajo considerable.
El presente artículo cubre temas relacionados al desarrollo de Servicios Windows como su creación, programación e instalación haciendo uso de Visual Studio .NET, desarrollando una aplicación de ejemplo. En un texto posterior veremos como se puede controlar un Servicio Windows, elaborando nuestro propio controlador.
Aplicación Ejemplo
El Servicio Windows realizará una tarea muy sencilla para propósitos didácticos que consiste en la escritura a intervalos regulares de líneas de información en un archivo de texto. Se tendrá la oportunidad de pausarlo, reiniciarlo y por supuesto detener su ejecución. El código fuente y el instalador de esta aplicación de ejemplo se pueden descargar aquí.
Creación del Servicio Windows.
Cuando se desea crear un servicio usando Visual Studio .NET se tiene a disposición una plantilla de proyecto denominada Windows Service. Al crearse el proyecto en forma automática se crea la referencia al espacio de nombres denominado System.ServiceProcess, cuyas clases nos permitirán crear el servicio. Los pasos son muy sencillos:
1. Crear un nuevo proyecto desde el entorno de desarrollo, seleccionar del diálogo desplegado la plantilla Windows Service como se muestra en la figura 1.

Figura 1. Creando un Servicio Windows
2. En la ventana Propiedades del Servicio, se debe establecer la propiedad nombre a WriterSample que es como se llamará nuestra aplicación de ejemplo y debe coincidir con el nombre usado en las clases del instalador que veremos mas adelante.

Figura 2. Ventana de propiedades del servicio recien creado.
3. Configurar algunas de las propiedades para indicar como funcionará el servicio.
| Propiedad |
Valor |
| CanStop |
True indica que el servicio podrá ser detenido
False previene que el servicio sea detenido.
|
| CanShutDown |
True indica que el servicio quiere recibir una notificación en caso la computadora donde reside inicie su proceso de apagado, permitiendo llamar al procedimiento OnShutDown |
| CanPauseAndContinue |
True indica que el servicio podrá ser pausado y reiniciado.
False evita que el servicio pueda ser pausado
|
| CanHandlePowerEvent |
True indica que el servicio es notificado de los cambios de estado de energía de la computadora; False previene que el servicio sea notificado de esos cambios. |
| AutoLog |
True. Permite al servicio escribir en el log de eventos Aplication cuando cumple una determinada acción; False deshabilita esta funcionalidad. |
Para propósitos de nuestro ejemplo permitiremos la pausa y reinicio del servicio.
4. Acceder al Editor de Código y comenzar a escribir en los procedimientos OnStart y OnStop

Figura 3. Ventana de código para el servicio recién creado.
5. Sobrescribir cualquier otro método para el cual quisiéramos dar funcionalidad.
Revisando el código de ejemplo
A continuación veremos el código de la aplicación ejemplo
Private Hilo As Thread = Nothing
Private objFile As File
Private objWriter As StreamWriter
Private log As New EventLog
Private PathFile As String = Configuration.ConfigurationSettings.
AppSettings("PathFile")
Private timeSleep As Integer = Configuration.ConfigurationSettings.
AppSettings("timeSleep")
|
En la parte superior de la clase declaramos variables que usaremos en varios de los procedimientos del servicio, como se muestra en la parte superior. Entre estas tenemos a la variable Hilo cuya función será la de permitirnos crear y controlar un hilo o thread, el cual llevará a cabo la ejecución del método que realiza la tarea principal del servicio.
Las variables objFile y objWriter son las que nos permitirán tratar con el archivo sobre el cual el servicio escribe.
Así mismo tenemos la posibilidad de crear e interactuar con nuestro propio log de eventos, esto mediante el uso de la variable log.
PathFile y timeSleep, especifican la ubicación del archivo a escribir y el tiempo de inactividad del thread en milisegundos, los valores de estas variables se extraen del archivo de configuración del servicio.

Figura 4. Contenido del archivo de configuración del servicio.
Los espacios de nombres adicionales que requerimos para estas funcionalidades son:
- System.Threading
- System.IO
- System.Diagnostics
La siguiente sección de interés es el procedimiento que contiene las instrucciones que se deben ejecutar cuando el servicio da inicio.
Protected Overrides Sub OnStart(ByVal args() As String)
Dim start As ThreadStart = New ThreadStart(AddressOf Writing)
Try
If Not objFile.Exists(pathFile) Then
objWriter = objFile.CreateText(Me.PathFile)
Else
objWriter = objFile.AppendText(Me.PathFile)
End If
objWriter.WriteLine("Inicio del trabajo de escritura : " & Now().ToString)
Hilo = New Thread(start)
Hilo.Start()
Catch ex As Exception
LogEvent(ex.Message)
End Try
End Sub
|
Dim start As ThreadStart = New ThreadStart(AddressOf Writing)
|
Con la línea anterior declaramos un tipo de puntero al código que se ejecutará dentro del hilo que hemos declarado para eso hacemos uso de la clase ThreadStart. El código a ejecutarse en el hilo será el contenido en el procedimiento Writing.
Referencias
Windows Services Applications -
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/ vboricreatingconfiguringwindowsserviceapplications.asp
Creando Servicios Windows -
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/ vboricreatingconfiguringwindowsserviceapplications.asp
Comenta éste artículo en el foro de informatizate.
|