Pregunta

¿Cómo se hace esto mejor? Quiero una aplicación que se ejecuta en un servidor para desencadenar un evento cada noche a las 03:00.

¿Fue útil?

Solución

Use ventanas programador de tareas

Otros consejos

Si quieres hacer esto en el funcionamiento de código de la aplicación (en lugar de utilizar un programador de tareas), debe elegir una duración dejar dormir a su aplicación que es bastante largo (por ejemplo, 1 hora, o 3.600 seg). bucles de su aplicación, y como cada llamada expira el sueño, la aplicación comprueba periódicamente la cantidad de tiempo que queda hasta la hora límite (03:00). Una vez que el tiempo restante se pone por debajo del intervalo de tiempo gruesa, debe ser reducido a un intervalo más corto (reducido a la mitad cada vez, o se reduce a 10 seg). Continuar el bucle, el dormir y reducir el tiempo de intervalo, hasta que se alcance el tiempo límite de destino.

Esto impide que el bucle de despertarse demasiado a menudo (86.400 intervalos de 1 seg es una exageración), sino que también evita el bucle de aplicación desde sobrepasar la hora límite de destino por dormir demasiado tiempo.

Se podría hacer un temporizador con un intervalo de 1 segundo y cuando suene la alarma, comprobar si son las 3:00.

Usted tendrá que construir en un servicio con el fin de asegurarse de que funciona incluso si no hay nadie conectado a la máquina, y luego hay un montón de diferentes métodos para asegurar que se produce el disparo.

Considere hacer una System.Timers.Timer donde el Interval se establece en la diferencia entre DateTime.Now y el siguiente las 3:00.

Hay dos opciones básicas aquí.

Si usted está tratando de hacer esto dentro de un servicio existente, se puede utilizar un temporizador para disparar a sí mismo a las 3:00 cada noche, y ejecutar su "tarea".

Una vez dicho esto, este es típicamente maneja mejor a través de Programador de tareas de windows . En lugar de mantener la aplicación viva 24/7, debe programar para que se ejecute una vez al día a las 3:00.


Editar:

Si tiene que trabajar con el programador de tareas de código (mencionado en otro comentario), que también es posible. El programador de tareas proporciona una API para la creación de las tareas individuales ( ITask ) a través del programador de tareas ( ITaskScheduler ).

Sin embargo, dado que usted está trabajando en XP Embedded, usted es probablemente mejor simplemente utilizando la capacidad de configuración del sistema normales, y la creación de una tarea a ejecutar una vez al día. En un sistema embebido, usted debe tener suficiente control durante la implementación de hacer esto.

Esta es una versión simplificada de un servicio que escribimos que corre un temporizador cada 60 segundos para ver una tabla ... que podría alterar el evento de temporizador transcurrido para comprobar el tiempo y ejecutarlo a continuación:

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 se puede, utilizar el programador de tareas como todo el mundo aquí se ha mencionado. Es la mejor forma de hacer esto. Me acaba de pasar a tener este código por ahí, así que pensé que había puesto que en caso de que podría ser útil para usted. Además, este código trabajó para nosotros, ya que no sabíamos cuando una fuente externa se va a editar una tabla. Ajuste del intervalo de un número correcto de milisegundos sería una manera mucho más eficiente de hacerlo, como ha señalado md5sum.

Esta respuesta podría ser un poco el jardín izquierdo, pero a menudo usar CruiseControl.NET algunas de nuestras tareas programadas. No es perfecto para todos ellos, pero si es un gran trabajo que desea ejecutar todas las noches y otro tipo de código / resultados dependen de ella, entonces es una buena opción. Se puede programar para que se ejecute cada vez, reciben un correo electrónico si ha funcionado / fallado. Ejecutar otros scripts / código si no funcionó, limpiar los archivos que necesita antes de empezar y después.

No es la solución perfecta para todas las situaciones, pero es maldita poderosa para aquellos que requieren. La usamos para algunos de nuestros grandes puestos de trabajo de procesamiento de datos, y nos envía un correo electrónico de todo si funciona / no e incluso tratar de nuevo 30 minutos más tarde si falló la primera vez. Se le da una buena sensación borrosa:)

planificador de tareas de Windows (como lo sugiere klausbyskov) o un trabajo de SQL Server.

EDIT:

O si quieres un tiempo dyanically asignado, se podría crear un servicio de Windows que las encuestas cada 10 minutos y lleva a cabo algún tipo de acción en el momento deseado (s).

Creación de un servidor de Windows en C # es bastante trivial y podría hacer esto . Sólo asegúrese de que usted tiene la seguridad y la tala descubierto, ya que puede ser bastante difícil saber lo que está pasando, si bien es (o no es) en ejecución.

System.Threading.Timer .

Estoy generar un subproceso en una aplicación ASP.NET para hacer las tareas programadas.

Depende de lo que tiene a su disposición.

Su mejor opción es utilizar un cron trabajo, si estás en Linux / Unix / Mac OS X, un programador de tareas en Windows, o launchd en las versiones más recientes de Mac OS X .

Si quieres hacer esto desde dentro de una aplicación, se necesitaría un bucle que comprueba el tiempo sobre una base regular y los incendios fuera el caso si se trata de 03:00, pero esto no es lo ideal.

Es el programa capaz de correr a través de línea de comandos? Si es así, crear un archivo foo.bat, y llame a su programa de línea de comandos (muy simple).

A continuación, utilice programador de tareas para ejecutar el archivo .bat a las 3 am todos los días.

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