(Win/C#/.Net) El subprograma necesita sondear en intervalos de una hora: ¿recomendaciones sobre el mejor método?

StackOverflow https://stackoverflow.com/questions/1538925

  •  20-09-2019
  •  | 
  •  

Pregunta

El subprograma necesita sondear la existencia de un directorio, digamos, cada 1 a 4 horas, y enviar un par de correos electrónicos/NET SEND si no lo encuentra.Aún no estoy seguro del intervalo exacto, pero definitivamente no será inferior a 1 hora.El "trabajo" general será permanente y estará en funcionamiento continuo en el futuro previsible.El subprograma se ejecutará en un servidor Win2k3 y, según los patrones de uso (extremadamente ligeros) del usuario, dudo que interfiera de manera notable con las funciones del servidor principal, ¡pero solo quiero que se comporte bien, por supuesto!Eventualmente se consideró implementarlo como un servicio Win, pero por varias razones, la primera implementación será como una aplicación de consola.

Buscando la implementación que sea más eficiente en términos de uso de recursos del sistema, específicamente CPU y RAM. Preocupado más por la implementación del momento/encuesta vs.Uso de CPU. No habrá un montón de objetos, GUI, etc.creado, por lo que el uso de RAM no debería ser un gran problema, pero ¿debo prestar especial atención a la recolección de basura si lo implemento como un .exe de larga duración (en el sentido de meses/años)?

¿FileSystemWatcher?
Sistema.Temporizadores.Temporizador?
Hilo.¿Dormir?
¿otro?

En realidad, mientras escribo esto, ocurre que la implementación más simple, desde el punto de vista de reutilizar las muchas "ruedas" existentes ya inventadas para este tipo de tarea, será no sondear en absoluto, sino simplemente diseñarlo para que comience, realice acciones, cierre y deje que la infraestructura de tareas programadas de Windows se encargue del aspecto de sincronización.Pero publiqué de todos modos para obtener la validación de esa idea + información general para referencia futura.¡TY!

¿Fue útil?

Solución

Windows tarea programada es definitivamente el camino a seguir. Y Thread.Sleep (n) es definitivamente no el camino a seguir. Un System.Timers.Timer sería el camino a seguir si se va a hacer esto dentro de su uso, con un intervalo inicial de 3600000. En cada evento transcurrido, debe desactivar el temporizador, hacer lo código que hay que hacer, a continuación, vuelve a habilitar el temporizador con un intervalo igual a la siguiente hora-de-la-hora menos la hora actual del sistema. De lo contrario su temporizador mandilará fuera de sincronización con la hora del sistema (aunque esto no podría ser importante para sus fines, en cuyo caso al diablo con él).

Otros consejos

Usar Windows servicios de programación para programar la ejecución de la aplicación de consola. Hacer una verificación sencilla para el directorio utilizando Directory.Exists y enviar mensajes de correo electrónico, según sea necesario.

Me gustaría ir con el diseño que se ejecute como una aplicación sin cabeza (el registro en el registro de eventos o el fregadero de elección) y dejar que el programador de tareas haga su trabajo y lo llaman en la hora.

No hay necesidad de complicar las cosas.

En el pasado he manejado tareas como que simplemente creando una aplicación de consola y hacer que se ejecute desde una tarea programada de Windows. De esa manera se puede llevar a cabo su acción y luego se descarga de la memoria. Además, es fácil de desactivar temporalmente la tarea programada si hay trabajo que hay que hacer con el servidor (como actualizaciones del sistema). Además, el programa tiene que cambiar (más / menos frecuencia), la interfaz de tarea programada ya representa múltiples ejecuciones.

Hemos tratado de escribir herramientas similares como servicios de Windows (como bien dice una aplicación en el futuro puede ser) por varias razones:

  • administración remota sencilla mediante NET.EXE (y eventualmente PowerShell)
  • System Center Operations Manager (anteriormente MOM)
  • Puede almacenar en caché los datos / objetos si es necesario
  • Normalización

Tenga en cuenta que hemos desarrollado un marco y una plantilla asociada para la creación de estos proyectos; de esa manera cada proyecto no tiene que manejar la configuración del intervalo de sondeo, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top