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 -