710 messaggi dal 13 novembre 2008
Contributi
ciao,
interessante articolo, utilizzo dei token memorizzati in una table dello storage di Azure che una volta scaduti occupano inutilmente spazio, penso possa essere interessante implementare questa soluzione; sarebbe bello avere un esempio per una soluzione che utilizza un timer di avvio ricorrente...
Grazie!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, grazie! Credo che si potrebbe risolvere anche senza timer. Dallo StartAsync avvii un task in questo modo:
private Task backgroundTask;
private CancellationTokenSource cancellationTokenSource;
public Task StartAsync(CancellationToken cancellationToken)
{
  //Questo ci serve per interrompere il lavoro quando l'applicazione viene arrestata
  cancellationTokenSource = new CancellationTokenSource();
  backgroundTask = DoWork(cancellationTokenSource.Token);
  return Task.CompletedTask;
}

Il metodo DoWork è quello che si occuperà di fare il lavoro in background. Puoi realizzarlo così, con dei Task.Delay per farlo attendere il tempo necessario prima di compiere la sua elaborazione.
public async Task DoWork(CancellationToken token)
{
  //Finché non viene richiesta la cancellazione...
  while (!token.IsCancellationRequested)
  {
    try {
      //Aspettiamo un po' prima di compiere l'operazione.
      //Ovviamente il valore 5000 può essere calcolato in base alle tue esigenze
      //es. numero di millsecondi restanti ad una specifica data/ora
      //Ad ogni iterazione del ciclo while lo puoi ricalcolare (se è differente di volta in volta)
      await Task.Delay(5000, token);

      //TODO: Qui fai il lavoro

    } catch (OperationCanceledException) {
      //Se è stata richiesta la cancellazione, usciamo dal ciclo
      break;
    }
  }
}


E poi nello StopAsync non resta che cancellare il token per segnalare al metodo DoWork che deve arrestarsi.
public async Task StopAsync(CancellationToken cancellationToken)
{
  cancellationTokenSource.Cancel();
}


ciao,
Moreno
Modificato da BrightSoul il 11 gennaio 2018 19.24 -

Enjoy learning and just keep making
1 messaggio dal 13 dicembre 2018
Ciao Moreno,
articolo molto interessante. Mi chiedevo è possibile tramite una richiesta dell'utente in una view interrompere e riprendere il task in esecuzione in background.
Immagino, un utente amministratore che per motivi di manutenzione o altro abbia la necessità di interrompere il task senza arrestare l'applicazione e poi riavviarlo.

Grazie
Gianluca
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Gianluca,
sì c'è un esempio qui, nel ramo start-stop:
https://github.com/BrightSoul/aspnetcore-realtime-binary/tree/start-stop

Quello è un progetto dimostrativo che ho usato in quest'altro script su SignalR:
https://www.aspitalia.com/script/1328/Consumare-Dati-Binari-Realtime-Lato-Client-ASP.NET-Core-SignalR.aspx

Ciao ciao

Enjoy learning and just keep making

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.