This article has been localized into French by the community.
Le DispatcherTimer
En WinForms, il existe un contrôle appelé Timer, qui peut exécuter une action de manière répétée selon un intervalle donné. WPF dispose également de cette possibilité, cependant, à la place d'un contrôle invisible, nous avons le contrôle DispatcherTimer. Il fait à peu près la même chose, toutefois, à la place de le glisser-déposer dans votre formulaire, vous le créez et l'utilisez exclusivement depuis votre code-behind.
La classe DispatcherTimer fonctionne en spécifiant un intervalle et, ensuite, en s'abonnant à l'événement Tick qui se déclenchera chaque fois que l'intervalle est rencontré. Le DispatcherTimer n'est démarré que lorsque vous appelez la méthode Start() ou définissez la valeur de la propriété IsEnabled à "true".
Essayons un exemple simple où nous utilisons un DispatcherTimer pour créer une horloge 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 partie XAML est extrêmement simple : il s'agit simplement d'un label centré avec une large taille de police, utilisé pour afficher l'heure actuelle.
Le code-behind est l'endroit où la magie opère dans cet exemple. Dans le constructeur de la fenêtre, nous créons une instance de DispatcherTimer. Nous définissons la propriété Interval à une seconde, nous abonnons à l'événement Tick et pour terminer, nous démarrons le timer. Dans l'événement Tick, nous mettons simplement à jour le label pour afficher l'heure actuelle.
Bien entendu, le DispatcherTimer peut fonctionner sur des intervalles plus ou moins grands. Par exemple, vous pourriez souhaiter effectuer une action seulement toutes les 30 secondes ou bien toutes les 5 minutes ; utilisez alors simplement les méthodes TimeSpan.From*, comme par exemple FromSeconds ou FromMinutes, ou créez une nouvelle instance de TimeSpan qui rencontre au mieux vos besoins.
Pour montrer de quoi le DispatcherTimer est capable, essayons de mettre à jour plus fréquemment. Beaucoup plus fréquemment !
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");
}
}
}
Comme vous pouvez le voir, nous demandons maintenant au DispatcherTimer de déclencher l'événement de mise à jour toutes les millisecondes ! Dans l'événement Tick, nous utilisons un format de temps personnalisé sous forme de chaîne de caractères pour aussi afficher les millisecondes dans le label. Maintenant vous obtenez quelque chose qui peut être utilisé facilement comme chronomètre. Ajoutez simplement un couple de boutons à la fenêtre et ensuite faites-leur appeler les méthodes Stop(), Start() et Restart() du timer.
En résumé
Il existe bon nombre de situations pour lesquelles vous pourriez avoir besoin de déclencher des actions à un intervalle donné, et pour ce faire utiliser le DispatcherTimer est une manière assez simple d'y arriver. Soyez juste attentif au fait que si vous effectuez quelque chose de compliqué dans votre événement Tick, cela ne devrait pas être exécuté trop souvent, comme dans le dernier exemple où le timer déclenche l'événement de mise à jour chaque milliseconde ; cela donnerait une lourde pression sur l'ordinateur faisant tourner votre application.
Aussi, sachez que le DispatcherTimer n'est pas précis à 100 % dans toutes les situations. Les opérations de mise à jour sont placées dans la file d'attente du Dispatcher, dès lors, si l'ordinateur est sous une pression importante, votre opération pourrait être différée. Le .NET framework promet que l'événement Tick ne se produira pas trop tôt, mais il ne peut cependant pas promettre qu'il ne sera pas légèrement différé. Cependant, dans la plupart des cas, le DispatcherTimer est plus que suffisamment précis.
Si vous avez besoin que votre timer ait une priorité plus élevée dans la file d'attente, vous pouvez définir la DispatcherPriority en envoyant une des valeurs correspondant à la priorité du DispatcherTimer. Plus d'informations à ce propos peuvent être trouvées sur cet article MSDN.