2009-04-07 6 views
5

Tengo una aplicación que necesita activar un par de eventos en ciertos momentos durante el día; los tiempos están definidos por los usuarios. Puedo pensar en un par de formas de hacerlo, pero ninguno de ellos se sienta demasiado bien. El tiempo no tiene que ser de una resolución particularmente alta; un minuto más o menos para cada camino está bien.¿Una buena forma de disparar un evento en un momento particular del día?

Mis ideas:

  1. Cuando la aplicación se inicia leer todos los tiempos y empezar temporizadores fuera que hará tictac en el momento apropiado

  2. inicio de un temporizador que va a comprobar cada minuto o por lo que para 'eventos actuales'

tia para cualquier mejor solución.

Respuesta

4
  • Almacene/indexe los eventos ordenados por cuando necesiten atención. Esto podría estar en la memoria o no de acuerdo con cuántos hay, con qué frecuencia realiza cambios, etc. Si todos sus eventos se activan una vez al día, esta lista es básicamente un búfer circular que solo cambia cuando los usuarios cambian sus eventos.
  • Inicie un temporizador que 'marcará' en el momento del evento en el encabezado de la lista. Redondea al próximo minuto si quieres.
  • Cuando el temporizador se dispara, procesa todos los eventos que ahora están en el pasado [edit - y que aún no han sido procesados], reinsertalos en la lista si es necesario (es decir, si no tienes el "circular" buffer "optimización", y establecer un nuevo temporizador.

Obviamente, cuando cambia el conjunto de eventos o cambia la hora de un evento existente, es posible que deba restablecer el temporizador para que se active antes. Por lo general, no tiene sentido reiniciarlo para disparar más tarde. Es mejor dejarlo funcionar y no hacer nada. Y si pone un límite superior de un minuto sobre cuánto tiempo puede funcionar el temporizador (o si solo tiene un temporizador recurrente de 1 minuto), puede obtener una precisión de 1 minuto sin tener que reiniciar. Esta es básicamente su opción 2.

Podría decirse que debería usar un marco existente en lugar de enrollar el suyo, pero no sé C#, así que no tengo idea de qué hay disponible. En general, soy un poco cauteloso con la idea de establecer una serie de temporizadores, porque algunos entornos no lo admiten (o no lo soportan bien). De ahí este esquema, que requiere solo uno. No sé si C# tiene algún problema al respecto, pero este esquema se puede organizar fácilmente para usar O (1) RAM si es necesario, que no se puede superar.

+0

Me gusta este enfoque también. – GWLlosa

3

Esto suena como un caso clásico para un servicio de Windows. Creo que hay un tipo de proyecto de servicio de Windows en VS2005/2008. El servicio junto con una base de datos simple y una aplicación de interfaz de usuario para permitir a los usuarios establecer los tiempos de activación serían todo lo que necesita.

Si no cambia muy a menudo, Tareas programadas también es una opción.

4

Eche un vistazo a Quartz.Net. Es un marco de programador (originalmente para Java).

+0

Utilizamos Quartz en nuestro equipo para Java. Lo recomiendo altamente. Se lanza bajo la licencia de Apache 2.0 (de uso gratuito, otorgue crédito donde corresponda) –

1

He escrito algunos programas en esta línea.

Sugiero # 2. Todo lo que necesita hacer es mantener una lista de veces que los eventos son "debidos" en, y cada X cantidad de tiempo (dependiendo de su resolución) revise su lista de eventos "ahora". Puede elegir algo de optimización si puede garantizar que la lista esté ordenada y que cada evento en la lista se realice exactamente una vez.De lo contrario, si tiene eventos recurrentes, debe asegurarse de cubrir su ventana. Lo que quiero decir es que si tienes un evento programado para las 11:30 a.m., y estás revisando cada segundo, es posible que puedas consultarlo a las 11:29:59, y luego no hasta las 11:31: 01, debido a la precisión de los cortes de tiempo de la CPU. Por lo tanto, deberá asegurarse de que uno de esos cheques (11:29 o 11:31) aún recoja el hit de las 11:30, y que SÓLO uno de ellos lo haga (es decir, que no se ejecute en ambos 11: 29 y 11:31).

La ventaja que tiene este enfoque sobre la verificación solo de los tiempos que sabe que están en su lista es que permite que terceros modifiquen su lista sin su conocimiento, y su controlador de eventos continuará 'simplemente funcionando'.

0

La manera más simple probablemente sea usar el programador de Windows.

De lo contrario, necesita utilizar una de las clases del temporizador, calculando cuánto tiempo transcurrirá hasta el primer evento. Este enfoque, a diferencia del planificador, permite que el proceso en ejecución encuentre nuevos eventos (y, posiblemente, reinicie el temporizador).

0

El problema con el n. ° 1 es que el número de milisegundos antes de un evento puede ser demasiado grande para almacenarlo en el intervalo del temporizador, y a medida que aumenta el número de eventos, la cantidad de temporizadores podría reducirse.

No veo nada malo en el n. ° 2, pero optaría por un trabajador de segundo plano o un hilo.

Cuestiones relacionadas