2009-08-18 19 views

Respuesta

46

utilizar la clase System.Threading.Timer:

var dt = ... // next 8:00 AM from now 
var timer = new Timer(callback, null, dt - DateTime.Now, TimeSpan.FromHours(24)); 

El delegado callback se llamará la próxima vez que son las 8:00 de la mañana y cada 24 horas a partir de entonces.

Consulte this SO question cómo calcular la siguiente aparición de las 8:00 a.m.

+4

Sé que siguiendo el enlace que lo menciona, pero puede ser que desee para aclarar que esto es System.Threading.Timer y no System.Windows.Forms.Timer – McAden

+1

¿funcionaría si doy el último 8.00 a partir de ahora? Entonces, ¿se da un número negativo? – Jaanus

+0

@Jaanus No, acabo de probarlo y arroja una excepción. Si dt ​​

0
private void Run_Timer() 
    { 
     DateTime tday = new DateTime(); 
     tday = DateTime.Today; 
     TimeSpan Start_Time = new TimeSpan(8,15,0); 
     DateTime Starter = tday + Start_Time; 
     Start_Time = new TimeSpan(20, 15, 0); 
     DateTime Ender = tday + Start_Time; 
     for (int i = 0; i <= 23; i++) 
     { 
      Start_Time = new TimeSpan(i, 15, 0); 
      tday += Start_Time; 
      if (((tday - DateTime.Now).TotalMilliseconds > 0) && (tday >= Starter) && (tday <= Ender)) 
      { 
       Time_To_Look = tday; 
       timer1.Interval = Convert.ToInt32((tday - DateTime.Now).TotalMilliseconds); 
       timer1.Start(); 
       MessageBox.Show(Time_To_Look.ToString()); 
       break; 
      } 
     } 
    } 

Podemos usar esta función para conseguir el temporizador corriendo para tiempos o cambiar para que se ejecute en un momento determinado: D

+0

Es obvio que la solución @dtb es mejor. – albertein

+2

Pero también es obvio que usted no tuvo la idea de que una persona que hace la pregunta comprenda mejor su pregunta. Estoy de acuerdo en que me dio un formato para hacerlo en un momento específico del día, pero tuve que hacerlo funcionar en algunos condiciones no estáticamente en un cierto momento del día una vez que la mayoría del trabajo realizado en mi código es para ejecutar ese ciclo y establecer el tiempo para la siguiente parada del cronómetro. Si puede ver que no el número de líneas en ese – Mobin

1

¿La alerta deberán ser aportados por el programa? Un enfoque alternativo es usar un Scheduled Task (in Windows) para generar la alerta. Puede que tenga que escribir un pequeño programa que recoge toda la información de los archivos de datos de la aplicación principal, etc.

hay un par de los beneficios principales de utilizar este enfoque:

  1. Usted no tiene que escribir ningún código para admitir la característica. Usted hace uso de algo integrado en el sistema operativo. El ejemplo es para Windows, pero otros sistemas operativos tienen la misma función. Puede concentrar su esfuerzo de desarrollo y soporte en su propio código.
  2. Su aplicación principal no tiene que estar ejecutándose para que la tarea se dispare.
9

Elaborando la respuesta de dtb así es como lo implementé.

private void Form1_Load(object sender, EventArgs e) 
    { 
     System.Threading.TimerCallback callback = new TimerCallback(ProcessTimerEvent); 

     //first occurrence at 
     var dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 0, 0); 

     if (DateTime.Now < dt) 
     { 
      var timer = new System.Threading.Timer(callback, null, 
               //other occurrences every 24 hours 
          dt - DateTime.Now, TimeSpan.FromHours(24)); 
     } 

    } 

    private void ProcessTimerEvent(object obj) 
    { 
     MessageBox.Show("Hi Its Time"); 
    } 
Cuestiones relacionadas