2009-03-30 14 views
11

Estoy a punto de desarrollar una aplicación de consola que se requerirá para ejecutar continuamente y llevar a cabo el trabajo en momentos específicos.Aplicación de consola C#: mantenlo funcionando

Mi pregunta es ¿cuáles son los mejores métodos o prácticas para mantener su aplicación viva?

Mi pensamiento era: ¿Un bucle que nunca termina? ¿Un temporizador que duerme y luego salta a la rutina cuando es necesario (después de establecer el período de reposo)?

Estaré compilando la aplicación en un exe y luego ejecutándola como un servicio usando AlwaysUp.

Saludos ..

Peter

+0

La razón por la que obtuviste tantos tipos diferentes de respuestas es porque no proporcionaste mucha información sobre lo que hará esta cosa. Con más información, podrá reducir algunas de las opciones presentadas hasta ahora. – Cheeso

Respuesta

8

¿Por qué no construir su aplicación como un servicio en el primer lugar?

+0

WIndows deben usar los servicios, ya que es el modelo que mejor soporta, no estoy seguro de quién te criticó por este. – ojblass

2

El código que se ejecuta continuamente se llama daemon y hay un artículo here que describe cómo hacer lo que pregunta. Eso lo señalará a un ejemplo de cómo escribir un servicio simple here.

+0

Sí, pensé en un servicio pero no creo que satisfaga mis necesidades, ya que necesito procesar archivos y leer información de configuración de un archivo almacenado para que funcione en momentos específicos como se especifica en el archivo de configuración. –

3

Probablemente no desee simplemente girar en un bucle que consuma innecesariamente el tiempo del procesador.

Suponiendo que está en Windows, debe tener un bucle que nunca finaliza con una llamada a WaitForSingleObject() o WaitForMultipleObjects() o MsgWaitForMultipleObjects() según sus necesidades. Luego tenga algún objeto de sincronización que lo despierte, como un evento nombrado.

Consulte la documentación de Sincronización de Win32 here. Si elabora más sobre lo que su programa necesita hacer, probablemente podamos brindarle consejos más específicos.

+0

Hola, Gracias por la actualización, el motivo por el que seleccioné hacer esto como una aplicación de consola es que luego me da la opción de ejecutarlo manualmente en cualquier momento. La aplicación leerá un archivo de configuración y ejecutará un archivo de lectura/proceso en un momento dado a partir de la información almacenada en el archivo de configuración. –

+0

También deberá enviar un correo electrónico de alerta si falta un archivo de un directorio certian. Si el archivo existe, necesita ser abierto y leído buscando errores, cualquier error luego un correo electrónico de alerta también debe ser enviado. –

1

Bueno, estoy seguro de que en algún momento debería parar, ¿no?

Genera un hilo que funciona, y tiene el bloque de hilos principal en Console.ReadLine() si quieres que también se pueda ejecutar como una aplicación de consola.

Si realmente solo desea pausar el hilo principal para siempre, simplemente bloquee en un evento ManualResetEvent que nunca se dispara.

Pero, considere usar un servicio si puede.

2

Si su programa va a funcionar continuamente, debe dormir hasta que ocurra el evento deseado (por ejemplo, XX segundos). Si simplemente gira en un ciclo while {}, succionará los tiempos de CPU.

Si su programa siempre se ejecutará en una máquina, entonces debería considerar la posibilidad de hacerlo un servicio para que se inicie automáticamente y se detenga con la máquina.

13

Una mejor solución sería escribir una aplicación de consola que hace su trabajo y se cierra. A continuación, puede usar el Programador de tareas de Windows para ejecutarlo periódicamente.

+2

¡Totalmente de acuerdo! Hace un tiempo, Jon Galloway escribió una publicación en un blog que me convenció de que lo estaba haciendo mal al hacer un servicio en lugar de una tarea: http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx –

+0

Creo que los servicios ofrecen más flexibilidad en términos de credenciales de usuario. – ojblass

+0

Al menos hasta donde he visto, puede establecer las credenciales bajo las que se ejecutará la tarea programada. ¿Qué puedes hacer con un servicio que no puedes con una tarea? –

1

Si está creando una aplicación de escritorio, querrá que se ejecute en la bandeja del sistema.Esto

  1. evitar que sus usuarios accidentalmente cerrar la aplicación
  2. quedará con su solicitud de estorbar la pantalla de sus usuarios

Si su construcción de una aplicación de servidor que se desea escribir un servicio de Windows. Esto

  1. Mantenga un administrador cierre accidentalmente su aplicación
  2. Eliminar la necesidad de que el servidor para que alguien ha iniciado sesión en la consola para su aplicación que se ejecuta en

Como alguien que es principalmente un profesional de TI Diría que las aplicaciones de terceros que obtenemos que se ejecutan como aplicaciones de consola en lugar de servicios de Windows nos esforzamos mucho para evitar que se compren. Crea mucho trabajo para nosotros y abre importantes problemas de soporte y agujeros de seguridad.

1

Enviando un hilo a dormir: System.Threading.Thread.Sleep (10000);

Esperando que se presione una tecla: Console.WriteLine ("Presione cualquier tecla para continuar ..."); Console.Read();

+0

Thread Sleep hace que el software se distribuya más lento y no se debe utilizar. Debe usar AutoResetSignal para una aplicación de consola o hacer un servicio si necesita ejecutarse todo el tiempo. – ppumkin

3

Puede agregar una referencia a System.Windows.Forms y llamar al System.Windows.Forms.Application.Run() para comenzar un bucle de mensaje de aplicación estándar. Ctrl-C terminará la aplicación.

Otra opción es usar Console.ReadKey() para pausar la aplicación. Como Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

Eso es lo que uso en mis aplicaciones de consola cuando están sentados allí esperando que ocurran los eventos. En cualquier caso, la aplicación continuará ejecutándose y atrapando los eventos activados (como un temporizador, WCF, FileWatcher, etc.).

2

Mientras que realmente debería estar usando un servicio para esto, si necesita/quiere hacer esto de todos modos, se puede utilizar un ManualResetEvent para hacer esto:

private ManualResetEvent Wait = new ManualResetEvent(false); 

Cuando haya terminado 'partir' y desee sólo tiene que esperar, que le hace a continuación:

Wait.WaitOne(); 

Cuando se quiere parar y dejar que la salida, a continuación, puede hacer:

Wait.Set(); 
Cuestiones relacionadas