[UWP] Utilizzo di ThreadPoolTimer
La classe ThreadPoolTimer ci fornisce due metodi statici che creano e danno lo Start a due tipi differenti di Timer:
- CreateTimer: crea un’istanza di ThreadPoolTimer che esegue un metodo dopo X secondi. Poi il timer si ferma.
- CreatePeriodicTimer: crea un’istanza di ThreadPoolTimer che esegue un metodo ogni X secondi (timer periodico)
In entrambi i casi il metodo da eseguire è specificato tramite il delegate TimerElapsedHandler.
In entrambi i casi il secondo parametro è un’istanza di TimeSpan. Nel primo caso rappresenta dopo quanto tempo il metodo deve essere eseguito. Nel secondo caso rappresenta l’intervallo di tempo che scatena periodicamente l’esecuzione del timer.
Entrambi i metodi prevedono un terzo parametro, un delegate TimerDestroyedHandler, che è il metodo che viene eseguito quando il timer termina la propria esecuzione.
Nel caso di CreateTimer, questo metodo viene eseguito in due momenti:
- quando il timer raggiunge il TimeSpan: prima viene eseguito il metodo TimerElapsedHandler, e poi TimerDestroyedHandler
- quando il timer viene (eventualmente) annullato dall’utente, ad esempio cliccando su un bottone
Nel caso di CreatePeriodicTimer, il metodo TimerDestroyedHandler viene eseguito solo quando l’utente eventualmente annulla e ferma il timer. Trattandosi di un timer periodico, teoricamente potrebbe proseguire all’infinito.
Entrambi i metodi restituiscono un’istanza di ThreadPoolTimer, istanza che dobbiamo salvarci da qualche parte, ad esempio per poterne invocare il metodo Cancel(). L’oggetto ThreadPoolTimer, oltre a questo metodo, espone anche tre property read-only:
- Delay, che è l’oggetto TimeSpan utilizzato dal Timer
- Period, che è l’intervallo di tempo previsto dal Timer periodico
Nel caso di CreateTimer, Delay contiene l’intervallo di tempo, mentre Period è zero.
Nel caso di CreatePeriodTimer, le due property equivalgono. Un timer periodico attende X secondi prima di eseguire TimerElapsedHandler, e poi ripete ogni X secondi. Delay e Period coincidono.
All’interno di TimerElapsedHandler o TimerDestroyedHandler non abbiamo ovviamente accesso al thread della UI, per cui dobbiamo passare dal Dispatcher della Window e chiamarne il metodo RunAsync se dobbiamo aggiornare qualcosa sull’interfaccia utente dell’applicazione.