80 messaggi dal 17 maggio 2011
Ciao a tutti,

Sto cercando soluzioni online ma non sto avendo successo.
Ho la necessità di creare un servizio con uno scheduler che contiene degli orari.
Al dato orario eseguire una procedura, qual'è per voi il metodo migliore?.

On line trovo tutti esempi con il tiemr interval e non è propriamente quello che dovrei fare.

A rigor di logica potrei settare il timer attraverso la differenza tra la data di avvio (o quella di esecuzione dell'ultimo evento) con quella del successivo nello scheduler, ma volevo chiedere un vs. consiglio.

Ciao
Paolo
4 messaggi dal 22 giugno 2011
Ciao,
io ho due approcci, uno di tipo "utente" uno di tipo "server".
In quello utente uso un timer che scatta ad ogni minuto al secondo "0" in autoreset e ogni tot cicli correggo la deriva (solitamente ogni mezz'ora). La prima volta lo carico di tanti secondi quanti mancano al secondo "0", poi al primo tick lo reimposto a 60 secondi. Ogni mezzora/un'ora ricarico in base alla distanza dallo "0" (per evitare la deriva).
Faccio attenzione a tenermi qualcosa "prima" per evitare di saltare un tick ma evitando anche di ripetere il tick due volte. E' una cosa meno banale di quanto possa sembrare, forse la più complicata di tutta la giostra, ma niente di impossibile.
Ad ogni evento tick controllo se nella lista dei task c'è qualcosa da fare e se lo trovo lo lancio.
Faccio questo se il software permette all'utente di aggiungere task a runtime, quindi non so quando possa accadere il prossimo evento.

Nell'approccio per i servizi invece faccio diversamente: generalmente ho i task indicati nel db (es procedure di backup, invio rapporti giornalieri, procedure di ordinamento e pulizie varie, ecc...) ma l'utente non ha possibilità di modificarli, vengono programmati esternamente e caricati una volta all'avvio. Se si cambiano tocca riavviare il servizio (per diversi altri motivi) quindi mi posso permettere di impostare un timer che va da un minimo di un minuto ad un massimo di 24 ore, puntando direttamente al prossimo evento schedulato che sono sicuro non cambierà e non compariranno magicamente altri nel frattempo. Quindi prendo la distanza da "adesso" al "prossimo evento" e non uso il timer come la lancetta dei minuti dell'orologio come faccio nell'altro caso.
Se non ho eventi punto la mezzanotte o un orario costante (per evitare di caricare timer da settimane!).
Questa seconda scelta evita di far fare operazioni sicuramente inutili durante il giorno.

Probabilmente ci sono soluzioni migliori (ne sono certo) ma così funziona discretamente bene.
Ciao!
80 messaggi dal 17 maggio 2011
Sono interessato chiaramente all'approccio al servizio.
Se ho capito bene non è molto diverso dall'approccio che avevo pensato io.

All'avvio carico il task.
Setto timer.Interval in base alla differenza tra la l'orario attuale.
In questo modo il servizio rimane sospese e non impegna troppe risorse.

Per comodità mi storicizzo anche id task a cui far riferimento.
Ricarico i task, verifico che non ci siano state modifiche al task da eseguire e procedo.
Terminato risetto il timer.interval al task successiso.

Corretto?
4 messaggi dal 22 giugno 2011
Se non prevedi la possibilità di inserire task a runtime direi di si.
Il fatto di ricaricare il task per vedere se ci sono state modifiche o no non l'ho capita però. Fino all'orario prestabilito il task non lo devi caricare. A orario carichi ed esegui.
Poi non so, potresti aver bisogno di qualche "finezza": ad esempio se avvii il servizio alle 12.15:35 ed avevi un task programmato per le 12.15 devi decidere se eseguire il task o no. Eventualmente segnarti da qualche parte che l'hai fatto, in modo che se riavvii il servizio due volte (es: 12.15:35 e 12.15:55) non fai le cose due volte... Robe di questo tipo.

Sia chiaro: anche se lo faccio per lavoro, io non mi ritengo tale da dire "come faccio io va bene". A me funziona ma sono sicuro che a livelli superiori ci sono soluzioni migliori.
Quindi magari, che so, aspetta anche il consiglio di qualcun altro più bravo di me. Così imparo qualcosa di più pure io. ;)
Ciao!
244 messaggi dal 22 gennaio 2017
Contributi
Hai già pensato a questi?

https://www.hangfire.io/
https://github.com/fluentscheduler/FluentScheduler
Modificato da andrea.tosato86 il 07 giugno 2018 14.02 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.