721 messaggi dal 08 aprile 2009
in un services backgound meglio utilizzare System.Timer o System.Threading.Timer?
11.862 messaggi dal 09 febbraio 2002
Contributi
Ciao Laura,
puoi usare l'uno o l'altro come preferisci. Sono documentati entrambi qui: uno richiama una callback mentre l'altro solleva un evento.
https://docs.microsoft.com/it-it/dotnet/standard/threading/timers

In alternativa ai timer, potresti predisporre un ciclo while e in esso mettere un await Task.Delay(millisecondi) che causerà un'attesa tra un'iterazione e l'altra del ciclo while.

Ecco un esempio di BackgroundService in cui viene coinvolto anche un CancellationToken, per fare in modo che il ciclo while e il Task.Delay terminino prematuramente se l'applicazione viene arrestata.
https://github.com/BrightSoul/aspnetcore-realtime-binary/blob/master/HostedServices/ImageGenerator.cs#L19

Attenzione perché usare la tecnica che vedi nell'esempio ha vantaggi e svantaggi rispetto a un timer:
Vantaggi:
  • Hai la garanzia che le esecuzioni non vadano a sovrapporsi. Infatti, la prossima non potrà essere eseguita finché quella precedente non ha finito;
  • Il codice risulta forse più leggibile.


Svantaggi:
  • Devi stare attenta a catturare tutte le eccezioni, altrimenti il ciclo while verrà interrotto;
  • Se l'esecuzione non procede a causa di un blocco qualsiasi, il ciclo while di fatto va in stallo. La policy Timeout di Polly potrebbe aiutarti a risolvere il problema;
  • Sarà più difficile eseguire un'operazione ESATTAMENTE ogni minuto. Infatti, la successiva esecuzione avverrà dopo il tempo della durata dell'esecuzione precedente + il tempo che hai indicato nel Task.Delay.


Oppure usi HangFire o Quartz.
https://medium.com/@qwe16165850/scheduler-in-net-core-2-1-hangfire-tutorial-aca4ae4274a6

ciao,
Moreno

Enjoy learning and just keep making
721 messaggi dal 08 aprile 2009
Interessante Hangfire. Non lo avevo mai visto. Se non sbaglio traccia tutto sotto database e quindi dovrei dargli una stringa di connessione?

Con i cicli while ho abbandonato la tecnica da tempo perchè troppo pericolosi.

Invece con System.Threading.Timer è possibile gestire se il callback è in esecuzione o tra quanto verrà eseguito?
11.862 messaggi dal 09 febbraio 2002
Contributi

Se non sbaglio traccia tutto sotto database e quindi dovrei dargli una stringa di connessione?

Esatto. Se non ti interessa persistere le informazioni ha anche uno storage in memoria.
Ha una comoda interfaccia web che ti permette di capire a che punto sono i job.


Invece con System.Threading.Timer è possibile gestire se il callback è in esecuzione o tra quanto verrà eseguito?

No, a differenza di HangFire, un Timer non ha alcuna API che ti permette di stabilire tra quanto verrà eseguito il job o come si sono concluse le esecuzioni precedenti. Dovresti implementare tutto tu.

ciao,
Moreno
Modificato da BrightSoul il 17 settembre 2019 20:36 -

Enjoy learning and just keep making
721 messaggi dal 08 aprile 2009
Infatti adesso ho implementato una cosa semplice che mi dice semplicemente se ci sono o meno dei task in esecuzione ma metterò a progetto l'implementazione di HangFire.
Grazie come al solito sei sempre di molto aiuto

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.