2009-10-26 17 views
12

El intervalo máximo de temporizador es 2.147.483.647. son aproximadamente 25 días. Pero en mis requisitos, necesito que el temporizador espere 30 días. ¿Cómo puedo resolverlo? Por favor ayuda.Intervalo de temporizador máximo

+2

que temporizador ?? ¡Hay al menos 3 temporizadores diferentes en .NET! –

+1

System.Threading; – Wilson

+7

No es un error por cierto. Un error es cuando su código y sus especificaciones no están de acuerdo. Creo que encontrarás que esta es una limitación bien documentada. – paxdiablo

Respuesta

22

Usa un System.Threading.Timer para esto. Hay constructores que toman un long, un uint o un TimeSpan en lugar de un int para el dueTime. Cualquiera de estos le permitirá establecer un período de 30 días.

actualización: esta es la manera más fácil de hacerlo:

System.Threading.Timer _timer; 
public void Start30DayTimer() 
{ 
    TimeSpan span = new TimeSpan(30, 0, 0, 0); 
    TimeSpan disablePeriodic = new TimeSpan(0, 0, 0, 0, -1); 
    _timer = new System.Threading.Timer(timer_TimerCallback, null, 
     span, disablePeriodic); 
} 

public void timer_TimerCallback(object state) 
{ 
    // do whatever needs to be done after 30 days 
    _timer.Dispose(); 
} 
+1

Y ahora solo tiene que mantener su sistema saludable y feliz durante 30 días. –

+3

@Henk: la pregunta no dice nada sobre * por qué * el período del temporizador debe ser de 30 días. Por lo que sabemos, este temporizador se puede utilizar para enviar un correo electrónico a alguien que diga "hey, este servidor ha estado funcionando durante 30 días seguidos". – MusiGenesis

+5

30 días, sí. Pero el máximo es de aproximadamente 49 días porque incluso si usa las versiones int64 o TimeSpan, no acepta un valor de más de 2 * 32-2 milisegundos. – RenniePet

13
int days = 30; 

Cree un temporizador por un período de un día.

Decremento days cada vez que se dispara el temporizador.

+2

Estoy de acuerdo. Los temporizadores en realidad no tienen la intención de soportar períodos de tiempo tan prolongados como 30 días, aunque mi temporizador se ejecutaría más de una vez al día. – ChrisBD

+5

System.Threading.Timer está limitado a aproximadamente 49 días (2 * 32 milisegundos), incluso utilizando las versiones int64 y TimeSpan. Entonces, para un temporizador de propósito general por períodos muy largos, algo así es un enfoque válido. – RenniePet

10

Siempre puede hacer que el temporizador espere un tiempo más corto, como un día y cada vez que el temporizador dispara incremente un contador y verifique el valor actual del contador. Si el valor es 30, ejecute el código que se supone que debe ejecutarse una vez cada 30 días.

Una mejor idea es establecer el valor en algún lugar en un archivo externo, de modo que si el programa se cierra inesperadamente, puede continuar desde donde lo dejó. Idealmente, probablemente desee colocar la siguiente fecha de ejecución en el archivo, de modo que si el programa está desactivado durante varios días, puede reanudar y hacer que se active en la fecha correcta sin tener que preocuparse por cuándo fue la última vez que se ejecutó. Así que algo como

NextRunDate = 10/10/2009 16:40

Cuando se ejecuta el programa que establece la fecha por delante de otros 30 días.

3

Establezca una variable de fecha y hora a la fecha y hora en que desea ejecutar lo que sea ... Luego haga que el temporizador revise cada minuto (o el nivel de exactitud requerido) para ver si esa fecha ha pasado.

1

Para hacer eso con un temporizador también necesita una aplicación y un PC que funciona sin interrupción durante más de 30 días. No es imposible, pero es un gran riesgo.

Parece que quiere la ejecución programada de algo. Calcule la fecha/hora objetivo y persista que sea un archivo XML o .config. Cuando se reinicia la aplicación, puede volver a calcular TimeSpan para activar el evento.

4

Este es el temporizador que le informa que su aplicación se implementa más correctamente como una tarea programada.

0

El constructor del temporizador tomará un TimeSpan que es int64 ticks seguramente eso es más de 25 días?

¿También ha considerado que el sistema no puede permanecer despierto durante 30 días?

Lo acabo de buscar, son 10,675,199 días.

4

Sugerí altamente el uso de la función de Windows Scheduled Task, especialmente si esto tiene la intención de ejecutar algo el mismo día de cada mes, ya que los meses varían entre 28 y 31 días.

+1

Esta no es una respuesta a la pregunta. Es algo completamente diferente si inicia una aplicación en un momento dado (planificador) o si su aplicación en ejecución está haciendo algo en un momento dado (temporizador). –

1

La biblioteca Quartz.NET es otra opción para ejecutar su código de forma programada.

Cuestiones relacionadas