2009-08-21 20 views
6

Estoy escribiendo un simple Servicio de Windows que envía correos electrónicos a todos los empleados cada mes. Mi pregunta es, ¿cómo detenerse cuando está hecho? Soy un noobie en este campo, así que por favor ayúdenme. Muy apreciado.¿Cómo detener un servicio de Windows mediante programación?

Se implementará en el servidor para que se ejecute mensualmente. No comencé esto y el código me fue dado así. Está escrito en VB.NET y ahora me piden que cambie algunas cosas al respecto. Me di cuenta de que solo había 'Sub OnStart' y me pregunté cuándo se detendría el servicio. Después de que se completa el submarino principal, ¿cuál es el estado de este servicio? ¿Se detuvo o simplemente se colgó allí? Lo siento, como dije, soy realmente nuevo en esto ....

Respuesta

7

Si tiene una tarea que se repite mensualmente, es mejor escribir una aplicación de consola y luego usar Windows Task Scheduler para configurarla para que se ejecute mensualmente. Se debe usar un servicio para procesos que necesitan ejecutarse durante mucho tiempo o constantemente, con o sin un usuario conectado

+0

Se implementará en el servidor para que se ejecute mensualmente. No comencé esto y el código me fue dado así. Está escrito en VB.NET y ahora me piden que cambie algunas cosas al respecto. Me di cuenta de que solo había 'Sub OnStart' y me pregunté cuándo se detendría el servicio. Después de que se completa el submarino principal, ¿cuál es el estado de este servicio? ¿Se detuvo o simplemente se colgó allí? Lo siento, como dije, soy realmente nuevo en esto .... – cplusplusNewbie

+1

Si eres nuevo en esto, entonces este es un buen momento para verte bien y acercarte a los que toman las decisiones con la sugerencia de Macros. Los servicios no son para el uso de una vez al mes, son continuos. Para el caso que mencionaste, es muy sencillo extraer el código de un servicio de Windows y convertirlo en una aplicación de consola. – MattH

3

Si se trata de un servicio Win32 (es decir, escrito en C o C++), simplemente llame a SetServiceStatus (SERVICE_STOPPED) y regresar de ServiceMain.

Por otro lado, si solo está enviando correos electrónicos una vez al mes, ¿por qué está utilizando un servicio? Use el Programador de tareas de Windows y ejecute una aplicación o script normal.

0

Puede ser mejor escribir esto como una tarea programada, sin duda sería más fácil de desarrollar inicialmente. Entonces, naturalmente, terminaría y no consumiría recursos durante el resto del mes.

Para responder a la pregunta original, se puede obtener una lista de los servicios en ejecución actuales en C#

services = System.ServiceProcess.ServiceController.GetServices(); 

a continuación, busque el que desee y establecer el estado parado

locatedService.Status == ServiceControllerStatus.Stopped 

completa ejemplo on msdn

0

net stop [service_name] ... en la línea de comandos también lo hará.

Pero, estoy de acuerdo con todos los demás; parece que el Programador de tareas de Windows cubrirá mejor sus necesidades.

6

Como ha notado cualquier otra respuesta, parece que esto debería ser un archivo ejecutable o secuencia de comandos que ejecuta como una tarea programada.

Sin embargo, si está obligado por algún motivo a ejecutar como un servicio de Windows y está trabajando en .NET, solo tiene que llamar al método Stop() heredado de ServiceBase una vez que su servicio complete su trabajo. A partir de la documentación de MSDN para el método:

El método Stop establece el estado de servicio para indicar una parada está pendiente y llama al método OnStop. Después de detener la aplicación , el estado del servicio se establece en detenido. Si la aplicación es un servicio alojado, el dominio de aplicación está descargado.

Hay una advertencia importante aquí: la cuenta de usuario con la que se ejecuta el servicio debe tener permiso para detener los servicios (que es un tema para ServerFault).

Una vez que el método de un servicio OnStart completa, continuará funcionando (no hacer nada) hasta que algo le dice que se detenga en una de las siguientes maneras:

0

¿Hay una razón por la que ha ser un servicio de Windows? De lo contrario, siga la solución de @Macros. Sin embargo, si lo hace, ¿por qué detener el servicio? Si lo detiene, tendrá que reiniciarse cuando los correos electrónicos se envíen. Según su descripción, no parece que requiera muchos recursos, por lo que sugiero simplemente instalarlo y dejarlo funcionar, arrancando una vez al mes para enviar los correos electrónicos.

0

esto es lo que hice en una situación similar.

el servicio de windows funciona 24/7 y procesa las unidades de trabajo. obtiene unidades de trabajo a través de una vista de base de datos.

tabla de mensajes de
  ProcessingStartTime
  CompletionDTE vista
  ...

la base de datos sólo lo hace con los registros marcados no-completo y tener un ProcessingStartTime en el pasado. Entonces, después de que el servicio confirma la transacción, ejecuta un procedimiento almacenado que actualiza el registro de la base de datos. Para este sistema, el usuario final carga archivos de Excel a asp.net webfrom que los importa a la base de datos.

Cuestiones relacionadas