Поделиться через


DispatcherTimer Класс

Определение

Предоставляет таймер, интегрированный в очередь диспетчера , которая обрабатывается с заданным интервалом времени и с заданным приоритетом.

/// [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
Наследование
Object IInspectable DispatcherTimer
Атрибуты

Требования к Windows

Семейство устройств
Windows 10 (появилось в 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (появилось в v1.0)

Примеры

В этом примере кода реализуется простой таймер в стиле консоли, который записывает данные в TextBlock с именем TimerLog (xaml, определяющий TimerLog , не отображается). Для параметра Interval задано значение 1, а в журнале отображается фактическое затраченное время для каждого элемента Tick.

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 ...
}

Комментарии

DispatcherTimer можно использовать для выполнения кода в том же потоке, который создает поток пользовательского интерфейса. Код, выполняющийся в этом потоке, имеет право создавать и изменять объекты, которые можно создавать и изменять только в потоке пользовательского интерфейса. Чтобы указать, что код должен выполняться в потоке пользовательского интерфейса, задайте свойство Interval и вызовите метод Start . Событие Tick срабатывает по истечении времени, указанного в параметре Interval . Tick продолжает запускаться с тем же интервалом , пока не будет вызван метод Stop , приложение не завершит работу или приложение не будет приостановлено (срабатывает Приостановка).

Одним из сценариев для DispatcherTimer является проверка свойств на датчиках, где изменения значений датчика не управляются исключительно событиями или события не дают нужной детализации. Это можно увидеть в примере акселерометра.

Другие сценарии для DispatcherTimer включают проверку изменений состояния, не имеющих связанных событий, или периодических обновлений пользовательского интерфейса, которые не могут использовать раскадровки анимации или двусторонней привязки.

Совет

При переносе кода Microsoft Silverlight или Windows Presentation Foundation (WPF) DispatcherTimer и связанного диспетчера находились в отдельном пространстве имен System.Windows.Threading. В среда выполнения Windows отсутствует пространство имен Windows.UI.Xaml.Threading, поэтому этот класс находится в Windows.UI.Xaml.

Если вы ничего не делаете с потоком пользовательского интерфейса в обработчиках Tick и вам нужен просто таймер, можно также использовать ThreadPoolTimer . Кроме того, для таких методов, как ThreadPoolTimer или задача .NET, вы не полностью изолированы от потока пользовательского интерфейса. Вы по-прежнему можете назначить поток пользовательского интерфейса асинхронно с помощью CoreDispatcher.RunAsync.

Конструкторы

DispatcherTimer()

Инициализирует новый экземпляр класса DispatcherTimer .

Свойства

Interval

Возвращает или задает интервал времени между тактами таймера.

IsEnabled

Возвращает значение, указывающее, запущен ли таймер.

Методы

Start()

Запускает DispatcherTimer.

Stop()

Останавливает DispatcherTimer.

События

Tick

Происходит по истечении интервала таймера.

Применяется к

См. также раздел