c# - tiempo - ¿Cómo desencadenar un evento a las 03:00 todas las noches?
lista de eventos en visual basic (12)
¿El programa puede ejecutarse a través de la línea de comando? Si es así, crea un archivo foo.bat y llama a tu línea de comandos del programa (muy simple).
Luego use el Programador de tareas para ejecutar el archivo .bat a las 3 a.m. diariamente.
¿Cómo se hace esto mejor? Quiero una aplicación que se ejecute en un servidor para activar un evento todas las noches a las 03:00.
Aquí hay una versión simplificada de un servicio que escribimos que ejecuta un temporizador cada 60 segundos para ver una tabla ... podrías alterar el evento de transcurrir del temporizador para verificar la hora y ejecutarlo luego:
Dim Timer As System.Timers.Timer
Protected Overrides Sub OnStart(ByVal args() As String)
Timer = New System.Timers.Timer(60000)
AddHandler Timer.Elapsed, AddressOf timer_Elapsed
Timer.Start()
End Sub
Protected Overrides Sub OnStop()
Timer2.Stop()
End Sub
Private Sub timer_Elapsed(ByVal pSender As Object, ByVal pargs As System.Timers.ElapsedEventArgs)
''Ensure the tick happens in the middle of the minute
If DateTime.Now.Second < 25 Then
Timer.Interval = 65000
ElseIf DateTime.Now.Second > 35 Then
Timer.Interval = 55000
ElseIf DateTime.Now.Second >= 25 And DateTime.Now.Second <= 35 Then
Timer.Interval = 60000
End If
''Logic goes here
End Sub
Obviamente, si puedes, usa el programador de tareas como todos los demás aquí mencionados. Es la forma preferida de hacer esto. Solo tenía este código por ahí, así que pensé en publicarlo en caso de que pudiera ser útil. Además, este código funcionó para nosotros porque nunca supimos cuándo una fuente externa iba a editar una tabla. Establecer el intervalo en una cantidad correcta de milisegundos sería una forma mucho más eficiente de hacerlo, como lo señala md5sum.
Depende de lo que tienes disponible para ti.
Su mejor opción es utilizar un trabajo cron , si está en Linux / Unix / Mac OS X, un programador de tareas en Windows o ejecute versiones más nuevas de Mac OS X.
Si desea hacer esto desde dentro de una aplicación, necesitaría un ciclo que verifique la hora regularmente y desconecte el evento si es 03:00, pero esto no es lo ideal.
Esta respuesta puede ser un poco el campo de la izquierda, pero a menudo usamos CruiseControl.NET para algunas de nuestras tareas programadas. No es perfecto para todos, pero si es un gran trabajo que desea ejecutar todas las noches y otros códigos / resultados dependen de él, entonces es una buena opción. Puede programar que se ejecute cada vez, obtenga correos electrónicos si funcionó / falló. Ejecute otros scripts / código si no funcionó, limpie los archivos que necesita antes y después de iniciar.
No es la solución perfecta para todas las situaciones, pero es condenadamente poderosa para los que la necesitan. Lo usamos para algunos de nuestros trabajos de procesamiento de big data, y nos envía a todos un correo electrónico si funcionó / falló e incluso lo intentaremos nuevamente 30 minutos más tarde si falló la primera vez. Te da una agradable sensación borrosa :)
Hay dos opciones básicas aquí.
Si intenta hacer esto dentro de un servicio existente, puede usar un temporizador para activarse a las 3:00 cada noche y ejecutar su "tarea".
Una vez dicho esto, esto normalmente se maneja mejor a través del Programador de tareas de Windows . En lugar de mantener la aplicación viva las 24 horas, solo tiene que programarla para que se ejecute una vez al día a las 3:00.
Editar:
Si necesita trabajar con el programador de tareas desde el código (mencionado en otro comentario), eso también es posible. El Programador de tareas proporciona una API para configurar Tareas individuales ( ITask ) a través del Programador de tareas ( ITaskScheduler ).
Sin embargo, dado que está trabajando en XP Embedded, probablemente sea mejor que simplemente use las capacidades normales de configuración del sistema y configure una tarea para que se ejecute una vez al día. En un sistema integrado, debe tener suficiente control durante su implementación para hacer esto.
Programador de tareas de Windows (como lo sugiere klausbyskov) o un trabajo de SQL Server.
EDITAR:
O bien, si desea un tiempo asignado dinámicamente, puede crear un servicio de Windows que sondee cada 10 minutos y realice alguna acción en los momentos deseados.
Puede hacer un temporizador con un intervalo de 1 segundo y cuando el temporizador se apaga, verifique si son las 3:00.
Si desea hacer esto al ejecutar el código de la aplicación (en lugar de utilizar un programador de tareas), debe elegir una duración para que la aplicación duerma bastante larga (por ejemplo, 1 hora o 3,600 segundos). Su aplicación realiza un bucle y, a medida que caduca cada llamada, la aplicación comprueba periódicamente cuánto tiempo queda hasta la hora límite (03:00). Una vez que el tiempo de sueño restante se encuentra por debajo del intervalo de tiempo aproximado, debe reducirse a un intervalo más corto (reducido a la mitad cada vez, o reducido a 10 segundos). Continúe el ciclo, durmiendo y reduciendo el intervalo de tiempo, hasta que se alcance el tiempo límite objetivo.
Esto evita que el ciclo se despierte con demasiada frecuencia (86.400 intervalos de 1 segundo son excesivos), pero también evita que el ciclo de la aplicación supere el tiempo límite objetivo al quedarse dormido demasiado tiempo.
Tendrá que compilarlo en un servicio para asegurarse de que se ejecute incluso si no hay nadie conectado a la máquina, y luego hay muchos métodos diferentes para garantizar que se produzca el desencadenador.
Considere la posibilidad de crear un System.Timers.Timer
en el que el Interval
esté configurado a la diferencia entre DateTime.Now
y las próximas 3:00.
Use System.Threading.Timer .
Estoy generando un hilo en una aplicación ASP.NET para hacer tareas programadas.
Use el programador de tareas de Windows
Crear un servidor de Windows en C # es bastante trivial y podría hacer esto. Solo asegúrate de que hayas descubierto la seguridad y el registro porque puede ser bastante difícil saber qué está pasando mientras se está ejecutando (o no).