2010-04-07 19 views
6

Sono in grado di creare un servizio Windows e installarlo.Servizio Windows che verrà eseguito ogni ora

Sono curioso di sapere come posso eseguire questo servizio ogni ora? Voglio che venga eseguito ogni ora periodicamente.

Ho anche bisogno di conoscere l'intervallo di ore che è in esecuzione in modo che possa memorizzarlo da qualche parte.

Come posso farlo?

Modifica: Questo servizio verrà installato su molte macchine, quindi, non voglio creare un'attività pianificata dire su 100 server.

risposta

12

Se si desidera un compito da eseguire a intervalli regolari al contrario di continuo, si dovrebbe considerare di usare il Task Scheduler.

Se è necessario che il proprio codice sia un servizio, ma che venga "attivato" ogni ora, l'approccio più semplice sarebbe rendere il servizio un oggetto COM e avere un'attività semplice pianificata ogni ora che richiama un jscript/vbscript che crea il tuo oggetto COM e chiama il metodo semplice su di esso.

L'alternativa è quella di utilizzare una qualsiasi delle API di attesa per "rifiuto" di un'ora senza consumare cicli.

Nota che devi anche considerare alcune decisioni di progettazione interessanti che dipendono da ciò che lo scenario è:

  • come è il vostro servizio sta per essere avviato se si arresta o viene fermato da parte dell'utente?
  • se si è iniziato dopo più di un'ora, si dovrebbe eseguire nuovamente o si deve aspettare di salire sul esatto calendario oraria?
  • come si fa a tenere traccia del l'ultima volta "attivazione" se il fuso orario o il tempo di risparmio luce del giorno è cambiato mentre tu non eri attivo?
  • fa il vostro servizio impedire al computer di andare a dormire/hibernate sul minimo o quando il coperchio del computer è chiuso? se non, avete bisogno di risvegliare il computer ogni ora per ottenere il vostro servizio di lavorare sul vostro programma?

Alcuni di questi sono gestiti dall'utilità di pianificazione, quindi consiglio vivamente di seguire quella rotta in attesa di un'ora nel codice.

+0

L'attesa API spreca il ciclo della CPU? Puoi approfondire questo? L'attesa è solo un evento generato dal sistema, non penso che stia sondando nulla. –

+0

Non sono sicuro che tu mi abbia capito correttamente. Stavo cercando di dire che le API di attesa sono ottimizzate per non utilizzare i cicli della CPU in attesa di un intervallo di tempo. –

3

È possibile creare un scheduled task che viene eseguito ogni ora, per eseguire il servizio o inviare un messaggio per "riattivare". Quindi, o passare l'ora corrente nella richiesta dell'attività pianificata, o semplicemente fare in modo che il programma riprenda l'ora corrente quando si riattiva.

Task Scheduler Managed Wrapper può aiutare a impostare questo su programmaticamente; puoi anche google per altre risorse.

+0

ma voglio essere in grado di implementarlo nel codice. immagina che questo servizio verrà installato su molti server, non voglio andare su ogni server e creare un'attività pianificata. – DarthVader

+1

@ user177883: è possibile creare attività pianificate in modo programmatico proprio come è possibile creare servizi in modo programmatico. –

3

Ci sono un paio di opzioni.

  1. Si può dormire per un'ora.
  2. Potrebbe essere più adatto per un'attività pianificata, non un servizio.
2
Thread.Sleep(1000*60*60); 
+2

Cosa succede se provi a interrompere il servizio mentre sta dormendo per un'ora? –

2
Thread.Sleep(TimeSpan.FromHours(1)); 

codice più leggibile questo modo

2

Thread.Sleep() soluzione farà in modo che il servizio verrà eseguito ad intervalli di un'ora, non ogni ora vale a dire ogni attività verrà avviata a 1 ora + tempo per eseguire l'operazione. Potresti utilizzare un Timer all'interno del tuo servizio. Questa sarà una soluzione più robusta dal momento che hai un controllo quando eseguire un'attività, monitorarne i progressi, ecc. Ricorda che ogni evento Timer verrà generato in un thread diverso e se l'operazione richiede più di un'ora per l'esecuzione potresti avere attendere il completamento del primo compito per evitare attività concorrenti.

0

Gli Utilità di pianificazione possono essere una buona idea, ma i servizi sono progettati per farlo. I servizi vengono installati facilmente e registrano le cose correttamente. Tutto quello che devi fare è, all'inizio del servizio, installare un timer di sistema (System.Threading.Timer) o c'è anche un altro timer.

Problemi correlati