TOC

This article has been localized into German by the community.

Sonstiges (miscellaneous):

Der DispatcherTimer

In WinForms gibt es ein Steuerelement namens Timer, mit dem eine Aktion innerhalb eines bestimmten Intervalls wiederholt ausgeführt werden kann. WPF hat diese Möglichkeit aber auch, jedoch anstelle eines unsichtbaren Steuerelements haben wir das Steuerelement DispatcherTimer. Es macht fast dasselbe, aber anstatt es in Ihrem Formular abzulegen, erstellen und verwenden Sie es ausschließlich in Ihrem Behind-Code.

Die DispatcherTimer-Klasse wird benutzt, indem man ein Zeitintervall bestimmt und dann dann das Tick-Ereignis abonniert, das jedes Mal auftritt, wenn das Zeitintervall einmal abgelaufen ist. Der DispatcherTimer wird erst gestartet, wenn Sie die Start() -Methode aufrufen und/oder die Eigenschaft IsEnabled auf true setzen.

Lassen Sie uns ein einfaches Beispiel betrachten, das den DispatcherTimer benutzt um eine Digitaluhr zu erstellen.

<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();
		}
	}
}

Der XAML Teil ist extrem einfach - Es handelt sich lediglich um ein mittenzentriertes Label mit einer großen Schriftgröße, das zur Anzeige der aktuellen Uhrzeit verwendet wird.

Im Code-Behind wird es dann spannend: im Konstruktor des Fensters erstellen wir eine DispatcherTimer-Instanz. Wir setzen die Eigenschaft Interval auf eine Sekunde, abonnieren das Tick-Ereignis und starten den Timer. Im Handler des Tick-Events aktualisieren wir einfach das Label, um die aktuelle Uhrzeit anzuzeigen.

Natürlich kann der DispatcherTimer mit kleineren oder größeren Intervallen arbeiten. Sie möchten zum Beispiel, dass nur alle 30 Sekunden oder 5 Minuten etwas passiert. Verwenden Sie einfach die TimeSpan.From... -Methoden, wie z.B. FromSeconds oder FromMinutes oder erstelle eine neuen TimeSpan-Wert mit dem gewünschten Zeitintervall.

Um zu zeigen, wozu der DispatcherTimer fähig ist, versuchen wir häufiger diesen zu aktualisieren ... Viel häufiger!

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");
		}
	}
}

Wie Sie sehen, wird jetzt der DispatcherTimer jede Millisekunde feuern. Im Tick-Ereignis verwenden wir eine benutzerdefiniertes Zeitformat, um auch die Millisekunden im Label anzuzeigen. Jetzt haben Sie etwas, das problemlos als Stoppuhr verwendet werden kann. Fügen Sie einfach ein paar Schaltflächen zum Fenster hinzu und lassen Sie sie die Methoden Stop(), Start() und Restart() des DispatchTimers aufrufen.

Zusammenfassung

Es gibt viele Situationen, in denen Sie ein bestimmtes Intervall in Ihrer Anwendung benötigen. Mit der dem DispatcherTimer ist das ziemlich einfach zu erreichen. Aber bedenken Sie: wenn Sie in Ihrem Tick-Ereignis etwas Aufwändiges tun, dann führen Sie es nicht zu oft aus, so wie im letzten Beispiel, wo der Timer jede Millisekunde tickt - das belastet den Computer stark.

Beachten Sie außerdem, dass der DispatcherTimer nicht in allen Situationen 100%-ig exakt ist. Die Tick-Vorgänge werden in die Dispatcher-Warteschlange gestellt, und falls der Computer stark ausgelastet ist, kann das Ereignis verzögert auslösen. Das .NET-Framework verspricht, dass das Tick-Ereignis nie zu früh auftritt, aber es kann nicht versprechen, dass es nicht ein wenig verzögert wird. Für die meisten Anwendungsfälle ist der DispatcherTimer jedoch mehr als präzise genug.

Wenn der Timer eine höhere Priorität innerhalb der Warteschlange des Programmablaufes bekommen soll, können Sie die Dispatcher Priority als Wert festlegen. Weitere Informationen hierzu finden Sie unter folgendem Link: MSDN Artikel.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!