Domanda

Come è questo fatto meglio? Voglio un app che è in esecuzione su un server per attivare un evento ogni sera alle 03:00.

È stato utile?

Soluzione

Usa Windows Task Scheduler

Altri suggerimenti

Se si vuole fare questo in esecuzione di codice app (invece di utilizzare un programmatore di operazione), si dovrebbe scegliere una durata di lasciare il vostro sonno app che è abbastanza lungo (per esempio, 1 ora, oppure 3.600 sec). La tua app loop, e come scade ogni chiamata sonno, l'applicazione controlla periodicamente quanto tempo è rimasto fino al momento scadenza (03:00). Una volta che il tempo rimanente sonno ottiene sotto l'intervallo di massima, esso dovrebbe essere ridotto a un intervallo più breve (dimezzata ogni volta, o ridotto a 10 secondi). Continuare il ciclo, il sonno e riducendo l'intervallo di tempo, fino a raggiungere il tempo di scadenza di destinazione.

In questo modo il ciclo di svegliarsi troppo spesso (86.400 intervalli di 1 sec è eccessivo), ma impedisce anche l'anello di app dal superamento del tempo di scadenza bersaglio dormendo troppo a lungo.

Si potrebbe fare un timer con un intervallo di 1 secondo e quando il timer si spegne, controllare se è 3:00.

Avrete bisogno di costruirlo in un servizio al fine di garantire che venga eseguito anche se non c'è nessuno registrato nella macchina, e poi ci sono un sacco di metodi diversi per garantire che si verifica il grilletto.

Si consideri facendo un System.Timers.Timer dove il Interval è impostato sulla differenza tra DateTime.Now e la prossima 03:00.

Ci sono due opzioni di base qui.

Se si sta cercando di fare questo all'interno di un servizio esistente, è possibile utilizzare un Timer per innescare da soli alle 3:00 ogni sera, ed eseguire il "compito".

Detto questo, questo è in genere meglio gestita tramite Windows Task Scheduler . Invece di mantenere l'applicazione viva 24/7, è sufficiente pianificare per eseguire una volta al giorno alle 3:00.


Modifica:

Se avete bisogno di lavorare con l'Utilità di pianificazione dal codice (di cui un altro commento), che è anche possibile. Task Scheduler fornisce una API per impostare singole attività ( ITask ) tramite l'Utilità di pianificazione ( ITaskScheduler ).

Tuttavia, dato che si sta lavorando su XP Embedded, probabilmente stai meglio solo utilizzando le normali funzionalità di configurazione del sistema, e la creazione di un compito da eseguire una volta al giorno. In un sistema embedded, si dovrebbe avere abbastanza controllo durante la distribuzione di farlo.

Ecco una versione semplificata di un servizio che abbiamo scritto che corre un timer ogni 60 secondi per guardare un tavolo ... si potrebbe modificare l'evento del timer è trascorso il tempo di controllare ed eseguirlo poi:

Dim Timer As System.Timers.Timer

Protected Overrides Sub OnStart(ByVal args() As String)
    Timer = New System.Timers.Timer(60000)
    AddHandler Timer.Elapsed, AddressOf timer_Elapsed
    Timer.Start()
End Sub

Protected Overrides Sub OnStop()
    Timer2.Stop()
End Sub

Private Sub timer_Elapsed(ByVal pSender As Object, ByVal pargs As System.Timers.ElapsedEventArgs)
    'Ensure the tick happens in the middle of the minute
    If DateTime.Now.Second < 25 Then
        Timer.Interval = 65000
    ElseIf DateTime.Now.Second > 35 Then
        Timer.Interval = 55000
    ElseIf DateTime.Now.Second >= 25 And DateTime.Now.Second <= 35 Then
        Timer.Interval = 60000
    End If

    'Logic goes here
 End Sub

Ovviamente, se è possibile, utilizzare l'utilità di pianificazione come tutti gli altri qui si è accennato. E 'il modo migliore di fare questo. Mi è capitato di avere questo codice, che in giro così ho pensato che avrei posto in caso potrebbe essere utile a voi. Inoltre, questo codice ha funzionato per noi perché non abbiamo mai saputo quando una fonte esterna stava andando a modificare una tabella. Impostazione dell'intervallo per un corretto numero di millisecondi sarebbe un modo molto più efficiente di fare questo, come ha sottolineato md5sum.

Questa risposta potrebbe essere un campo di sinistra po ', ma spesso usare CruiseControl.NET alcune delle nostre attività pianificate. Non è perfetto per tutti, ma se si tratta di un grande lavoro che si desidera eseguire ogni notte e altro codice / i risultati dipendono da essa, allora è una buona scelta. È possibile pianificare l'esecuzione ogni volta, arrivare le email se ha funzionato / fallito. Eseguire altri script / codice, se non ha funzionato, ripulire i file necessari prima di iniziare e dopo.

Non è la soluzione perfetta per tutte le situazioni, ma è dannatamente potente per coloro che chiamano per esso. L'usiamo per alcuni dei nostri posti di lavoro grandi di elaborazione dati, e ci invia tutti una e-mail se ha funzionato / fallito e sarà anche provare di nuovo dopo 30 minuti se non è riuscito per la prima volta. Ti dà una bella sensazione sfocata:)

pianificazione di Windows (come suggerito da klausbyskov) o di un processo di SQL Server.

EDIT:

Se si desidera un tempo dyanically assegnato, è possibile creare un servizio di Windows che i sondaggi ogni 10 minuti ed esegue qualche azione al momento desiderato (s).

Creazione di un server Windows in C # è abbastanza banale e potrebbe farlo . Basta fare in modo di avere la sicurezza e la registrazione capito perché può essere piuttosto difficile dire cosa sta succedendo mentre è (o non è) in esecuzione.

System.Threading.Timer .

Sono un thread in un'applicazione ASP.NET per fare operazioni pianificate.

Dipende da quello che avete a vostra disposizione.

La cosa migliore è quella di utilizzare un cron lavoro, se siete su Linux / Unix / Mac OS X, un programmatore di operazione su Windows, o launchd sulle versioni più recenti di Mac OS X .

Se si vuole fare questo dall'interno di un'applicazione, si avrebbe bisogno di un ciclo che controlla l'ora in maniera regolare e spara fuori l'evento, se è 03:00, ma questo non è l'ideale.

Il programma è in grado di eseguire tramite linea di comando? Se è così, creare un file foo.bat, e chiamare la riga di comando del programma (molto semplice).

Quindi utilizzare Utilità di pianificazione per eseguire il file .bat alle 3 del mattino tutti i giorni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top