2012-08-12 14 views
5

Ho trovato this answer e cerco di seguirlo, ma non mi ha portato alcun lavoro mentre avvio il mio servizio. Una cosa che non riesco a capire è: `_timer = new Timer (10 * 60 * 1000); // ogni 10 minutiPianificare un servizio Windows C# per eseguire un'attività quotidianamente

Desidero eseguire il mio servizio tutti i giorni alle 22:00, come potrei farlo?

+0

A seconda di cosa si sta cercando di correre, potrebbe essere meglio per costruire solo come un'applicazione console e hanno la pianificazione di Windows eseguito ogni volta che vuoi. –

+0

@Nothing puoi accettare la risposta 'Adil'? che sta funzionando bene e anche una bella soluzione. :) Poiché questa domanda è in una categoria senza risposta. +1 la tua domanda e la risposta 'Adil'. Utile :))))., – RajeshKdev

risposta

7

Si può scoprire la difference tra il current time e la vostra desired schedule time e rendere l'intervallo di trascorrere conseguenza. In questo modo l'evento del timer will fire once al momento previsto. Imposta l'intervallo di tempo a 24 ore quando è trascorso.

private System.Timers.Timer _timer;  

private void SetTimer() 
{ 
    DateTime currentTime = DateTime.Now; 
    int intervalToElapse = 0; 
    DateTime scheduleTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 10,0,0); 

    if (currentTime <= scheduleTime) 
     intervalToElapse = (int)scheduleTime.Subtract(currentTime).TotalSeconds; 
    else 
     intervalToElapse = (int)scheduleTime.AddDays(1).Subtract(currentTime).TotalSeconds; 

    _timer = new System.Timers.Timer(intervalToElapse); 

    _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed); 
    _timer.Start(); 
} 

void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
     //do your work 
     _timer.Interval = (24 * 60 * 60 * 1000); 
} 
+1

Devo usare il metodo 'SetTimer' in' OnStart'? – Nothing

+2

Puoi chiamarlo dove vuoi, ma la chiamata su OnStart farà in modo che non manchi l'attività di pianificazione. ad esempio, il tuo servizio è iniziato alle 9:58, quindi deve essere chiamato in modo che l'evento del timer scada al 10 – Adil

+1

Bello!^____ ^ – Sai

1

Anche se il Timer è polling ogni dieci minuti la risposta si fa riferimento - il suo unico trattamento una volta al giorno:

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    // ignore the time, just compare the date 
    if (_lastRun.Date < DateTime.Now.Date) 
    { 

per farlo accadere alle 10:00 aggiungere un'altra condizione, ad esempio:

_lastRun.Date < DateTime.Now.Date & & DateTime.Now.Hour = 10

I dieci minuti sono il tempo utilizzato come frequenza di polling.

+0

Quindi potresti dirmi cosa significa quel 10 minuti? Grazie. – Nothing

+0

Vedi la mia modifica. Se si desidera che il codice lo esegua in un'attività pianificata, è sufficiente disporre di un exe che quando si inizia con un parametro della riga di comando esegue il processo, ma se si dovesse fare doppio clic sull'exe, questo mostrerà le istruzioni su come eseguirlo incustodito - in questo modo le persone non casualmente colpiscono un processo quando si stanno chiedendo cosa fa il programma. –

3

Windows ha un programmatore di attività incorporato che è molto meglio utilizzare per qualsiasi esigenza di pianificazione. Ci sono molte cose che possono andare storte quando si lavora con attività di pianificazione come un riavvio del sistema, risparmi di luce del giorno.

Può riferirsi ad un blog di Ayende su alcune delle problematiche sbagliate nel creare il proprio programmatore. Rotten scheduling: Don’t roll your own

4

Invece di eseguire il proprio timer, è possibile utilizzare Quartz.NET per ospitare il servizio. Funziona bene e ha alcune funzionalità aggiuntive come recupero (se necessario) e la possibilità di coltivare il servizio.

http://quartznet.sourceforge.net/

+0

hmm - questo suona bene ma ho dato un'occhiata alla pagina e non aveva molte informazioni, hai un esempio di codice? ** Modifica ** - [trovato] (http://quartznet.sourceforge.net/tutorial/lesson_1.html) –

Problemi correlati