DispatcherTimer Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt einen Timer bereit, der in die Dispatcher-Warteschlange integriert ist, die zu einem angegebenen Zeitintervall und zu einer angegebenen Priorität verarbeitet wird.
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class DispatcherTimer
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class DispatcherTimer
Public Class DispatcherTimer
- Vererbung
- Attribute
Windows-Anforderungen
Gerätefamilie |
Windows 10 (eingeführt in 10.0.10240.0)
|
API contract |
Windows.Foundation.UniversalApiContract (eingeführt in v1.0)
|
Beispiele
Dieser Beispielcode implementiert einen einfachen Timer im Konsolenstil, der Daten in einen TextBlock mit dem Namen schreibt TimerLog
(XAML, das definiert TimerLog
wird, wird nicht angezeigt). Der Wert Intervall ist auf 1 festgelegt, und das Protokoll zeigt die tatsächliche verstrichene Zeit für jeden Tick an.
DispatcherTimer dispatcherTimer;
DateTimeOffset startTime;
DateTimeOffset lastTime;
DateTimeOffset stopTime;
int timesTicked = 1;
int timesToTick = 10;
public void DispatcherTimerSetup()
{
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
//IsEnabled defaults to false
TimerLog.Text += "dispatcherTimer.IsEnabled = " + dispatcherTimer.IsEnabled + "\n";
startTime = DateTimeOffset.Now;
lastTime = startTime;
TimerLog.Text += "Calling dispatcherTimer.Start()\n";
dispatcherTimer.Start();
//IsEnabled should now be true after calling start
TimerLog.Text += "dispatcherTimer.IsEnabled = " + dispatcherTimer.IsEnabled + "\n";
}
void dispatcherTimer_Tick(object sender, object e)
{
DateTimeOffset time = DateTimeOffset.Now;
TimeSpan span = time - lastTime;
lastTime = time;
//Time since last tick should be very very close to Interval
TimerLog.Text += timesTicked + "\t time since last tick: " + span.ToString() + "\n";
timesTicked++;
if (timesTicked > timesToTick)
{
stopTime = time;
TimerLog.Text += "Calling dispatcherTimer.Stop()\n";
dispatcherTimer.Stop();
//IsEnabled should now be false after calling stop
TimerLog.Text += "dispatcherTimer.IsEnabled = " + dispatcherTimer.IsEnabled + "\n";
span = stopTime - startTime;
TimerLog.Text += "Total Time Start-Stop: " + span.ToString() + "\n";
}
}
private void Page_Loaded_1(object sender, RoutedEventArgs e)
{
DispatcherTimerSetup();
}
// MainPage.cpp
...
#include <chrono>
...
void MainPage::StartTimerAndRegisterHandler()
{
Windows::UI::Xaml::DispatcherTimer timer;
timer.Interval(std::chrono::milliseconds{ 500 });
auto registrationtoken = timer.Tick({this, &MainPage::OnTick });
timer.Start();
}
void MainPage::OnTick(Windows::Foundation::IInspectable const& /* sender */,
Windows::Foundation::IInspectable const& /* e */)
{
// do something on each tick here ...
}
// .cpp definition, .h not shown
void MainPage::StartTimerAndRegisterHandler() {
auto timer = ref new Windows::UI::Xaml::DispatcherTimer();
TimeSpan ts;
ts.Duration = 500;
timer->Interval = ts;
timer->Start();
auto registrationtoken = timer->Tick += ref new EventHandler<Object^>(this,&MainPage::OnTick);
}
void MainPage::OnTick(Object^ sender, Object^ e) {
// do something on each tick here ...
}
Hinweise
Der DispatcherTimer kann verwendet werden, um Code auf demselben Thread auszuführen, der den UI-Thread erzeugt. Code, der in diesem Thread ausgeführt wird, hat die Berechtigung, Objekte zu erstellen und zu ändern, die nur im UI-Thread erstellt und geändert werden können. Um anzugeben, dass Code im UI-Thread ausgeführt werden soll, legen Sie die Interval-Eigenschaft fest, und rufen Sie dann die Start-Methode auf. Das Tick-Ereignis wird ausgelöst, nachdem die in Interval angegebene Zeit abgelaufen ist. Das Häkchen wird im gleichen Intervall fortgesetzt, bis die Stop-Methode aufgerufen wird, die App beendet oder die App angehalten wird (löst Suspending aus).
Ein Szenario für DispatcherTimer besteht darin, Eigenschaften auf Sensoren zu überprüfen, bei denen Änderungen an den Sensorwerten nicht rein ereignisgesteuert sind oder die Ereignisse nicht die gewünschte Granularität bieten. Dies sehen Sie im Beispiel Beschleunigungsmesser.
Andere Szenarien für DispatcherTimer umfassen die Überprüfung auf Zustandsänderungen ohne zugehörige Ereignisse oder für regelmäßige Benutzeroberflächenupdates, die keine Storyboardanimation oder eine bidirektionale Bindung verwenden können.
Tipp
Wenn Sie Microsoft Silverlight- oder Windows Presentation Foundation -Code (WPF) migrieren, befanden sich der DispatcherTimer und der zugehörige Dispatcher in einem separaten System.Windows.Threading-Namespace. Es gibt keinen Windows.UI.Xaml.Threading-Namespace im Windows-Runtime, daher befindet sich diese Klasse in Windows.UI.Xaml.
Wenn Sie nichts mit dem UI-Thread in Ihren Tick-Handlern tun und nur einen Timer benötigen, können Sie stattdessen auch ThreadPoolTimer verwenden. Außerdem sind Sie bei Techniken wie ThreadPoolTimer oder einer . NET-Aufgabe nicht vollständig vom UI-Thread isoliert. Sie können dem UI-Thread weiterhin asynchron mit CoreDispatcher.RunAsync zuweisen.
Konstruktoren
DispatcherTimer() |
Initialisiert eine neue instance der DispatcherTimer-Klasse. |
Eigenschaften
Interval |
Ruft die Zeitspanne zwischen Timer-Ticks ab oder legt sie fest. |
IsEnabled |
Ruft einen Wert ab, der angibt, ob der Timer ausgeführt wird. |
Methoden
Start() |
Startet den DispatcherTimer. |
Stop() |
Beendet den DispatcherTimer. |
Ereignisse
Tick |
Tritt auf, wenn das Zeitgeberintervall verstrichen ist. |