2011-11-14 2 views
8

Ho uno scheduler simile a crontab. Definizione Time "MM HH WD MD M":

MM- minuti
HH- ore
WD- giorni della settimana
MD - giorni del mese
M - mesiCalcola Cron Ora successiva in C#

WD, MD e M consentono a più voci e ciascuno dei params può essere null, ad esempio:

^^0, 1^^  means exucution every minute, every hour, at sunday and mondey, every day<br> 

35 15^^^ execution every day at 15.35<br> 

Il problema è come calcolare la prossima fase di esecuzione, se si sa ultima data di esecuzione. So come farlo usando il ciclo (basta aggiungere 1 minuto finché non si adatta alla condizione), ma ci deve essere un modo migliore.

+0

Avete bisogno di un DateTime? – kol

+0

Spero non stiate sottovalutando il lavoro. Se vuoi davvero essere compatibile con cron (POSIX), devi [provvedere a uno _lot più di quello_] (http://pubs.opengroup.org/onlinepubs/7908799/xcu/crontab.html) (lo so, Ho implementato quella volta in C++) – sehe

+2

@kol: Credo che abbia bisogno di Noda Time ** edit ** a _lot of time _.... :) – sehe

risposta

14

Ho utilizzato con successo NCrontab esattamente per questo scopo.

usando qualcosa come

var schedule = CrontabSchedule.Parse("15 35 * * *"); 
return schedule.GetNextOccurrence(DateTime.Now); 
+0

Fantastico! Ma una domanda. Se, ad esempio, SomeDate è il tempo di esecuzione GetNextOccurence (SomeDate) restituirà SomeDate? – user1016945

+0

Abbastanza sicuro che restituirà l'occorrenza successiva, ma GetNextOccurrences (startTime, endTime) restituirà IEnumerable di tutte le occorrenze in tale intervallo. :) – devrooms

+0

sembra essersi spostato da google code a github, ma non vengono forniti collegamenti: https://github.com/atifaziz/NCrontab – froque

2

È possibile sia il codice che voi stessi usando DateTime e TimeSpan - ad esempio:

DateTime.Now == DateTime.Now.Date.AddHours (15).AddMinutes (35) 

controlla se si tratta di 15:35 attualmente (e quindi un po 'di esecuzione deve avvenire), controlli simili può essere implementato per giorno della settimana, giorno del mese ecc.

o utilizzare una libreria .NET opensource veramente bella denominata NodaTime (è decisamente un modo migliore).

Un'altra opzione è quella di utilizzare una diversa architettura - per questo tipo di pianificazione apps/servizi v'è un opensource NET libreria chiamata Quartz (è ancora meglio), che fa tra questi calcoli un sacco di altre cose molto utili in questo contesto.

+1

No, questo non funzionerà. 15:35! = Ora + 15 ore + 35 minuti ... – kol

+1

@kol devi avere sovrapposizioni che non ho aggiunto a Adesso ma hai reso l'aggiunta a ** DateTime.Now.Date ** che è mezzanotte quindi l'aggiunta si applica! – Yahia

+0

Oops :) Ottima idea! – kol