This article has been localized into Italian by the community.
ll DispatcherTimer
In WinForms, c'è un controllo chiamato Timer, che può eseguire un'azione ripetutamente entro un determinato intervallo. Anche WPF ha questa possibilità, ma invece di un controllo invisibile, abbiamo il controllo DispatcherTimer . Fa praticamente la stessa cosa, ma invece di dropparlo sul tuo modulo, lo crei e lo usi esclusivamente nel tuo codice Code-behind.
La classe DispatcherTimer funziona specificando un intervallo e quindi iscrivendosi all'evento Tick che si verificherà ogni volta che questo intervallo è scaduto. DispatcherTimer non viene avviato prima di chiamare il metodo Start () o impostare la proprietà IsEnabled su true.
Proviamo un semplice esempio in cui utilizziamo un DispatcherTimer per creare un orologio digitale:
<Window x:Class="WpfTutorialSamples.Misc.DispatcherTimerSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DispatcherTimerSample" Height="150" Width="250">
<Grid>
<Label Name="lblTime" FontSize="48" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</Window>
using System;
using System.Windows;
using System.Windows.Threading;
namespace WpfTutorialSamples.Misc
{
public partial class DispatcherTimerSample : Window
{
public DispatcherTimerSample()
{
InitializeComponent();
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += timer_Tick;
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
lblTime.Content = DateTime.Now.ToLongTimeString();
}
}
}
La parte XAML è estremamente semplice: è semplicemente un'etichetta centrata con una dimensione del carattere grande, utilizzata per visualizzare l'ora corrente.
Nel costruttore della finestra, creiamo un'istanza DispatcherTimer. Impostiamo la proprietà Interval su un secondo, ci iscriviamo all'evento Tick e quindi facciamo lo start del timer. Nell'evento Tick, aggiorniamo semplicemente l'etichetta che mostra l'ora corrente.
Naturalmente, DispatcherTimer può funzionare a intervalli più piccoli o molto più grandi. Ad esempio, potresti voler solo succedere qualcosa ogni 30 secondi o 5 minuti: basta usare i metodi TimeSpan.From *, come FromSeconds o FromMinutes, oppure creare una nuova istanza di TimeSpan che si adatta perfettamente alle tue esigenze.
Per mostrare di cosa è capace DispatcherTimer, proviamo ad aggiornare più frequentemente
using System;
using System.Windows;
using System.Windows.Threading;
namespace WpfTutorialSamples.Misc
{
public partial class DispatcherTimerSample : Window
{
public DispatcherTimerSample()
{
InitializeComponent();
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(1);
timer.Tick += timer_Tick;
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
lblTime.Content = DateTime.Now.ToString("HH:mm:ss.fff");
}
}
}
Come puoi vedere, ora chiediamo al DispatcherTimer di aggiornarsi ogni millisecondo! Nell'evento Tick, usiamo una stringa di formato ora personalizzata per mostrare i millisecondi anche nell'etichetta. Ora hai qualcosa che potrebbe essere facilmente usato come cronometro: aggiungi un paio di pulsanti alla finestra e poi chiamali Stop () , Start () e Restart() sul timer.
Riassunto
Esistono molte situazioni in cui è necessario che si verifichi qualcosa nell'applicazione a un determinato intervallo e utilizzando DispatcherTimer, è abbastanza facile riuscire. Tieni presente che se fai qualcosa di complicato nel tuo evento Tick, non dovrebbe essere eseguito troppo spesso, come nell'ultimo esempio in cui il timer spunta ogni millisecondo - ciò metterà a dura prova il computer che esegue l'applicazione.
Inoltre, tenere presente che DispatcherTimer non è preciso al 100% in tutte le situazioni. Le operazioni di spunta vengono inserite nella coda Dispatcher, quindi se il computer è sotto pressione, l'operazione potrebbe essere ritardata. Il framework .NET promette che l'evento Tick non si verificherà mai troppo presto, ma non può promettere che non sarà leggermente ritardato. Tuttavia, per la maggior parte dei casi d'uso, DispatcherTimer è più che abbastanza preciso.
Se è necessario che il timer abbia una priorità più alta nella coda, è possibile impostare DispatcherPriority inviando uno dei valori su DispatcherTimer priorità. Ulteriori informazioni al riguardo sono disponibili in questo articolo MSDN .