DispatcherTimer 类

定义

提供集成到 Dispatcher 队列中的计时器,该队列按指定的时间间隔和指定的优先级进行处理。

/// [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 中引入)

示例

此示例代码实现一个简单的控制台样式计时器,该计时器将数据写入名为“ (XAML”的 TimerLogTextBlock,该 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 可用于在生成 UI 线程的同一线程上运行代码。 在此线程上运行的代码有权创建和修改只能在 UI 线程上创建和修改的对象。 若要指定代码应在 UI 线程上运行,请设置 Interval 属性,然后调用 Start 方法。 Tick 事件在间隔中指定的时间过后触发。 Tick 继续以相同的 间隔 触发,直到调用 Stop 方法、应用终止或应用暂停 (触发 Suspending) 。

DispatcherTimer 的一种方案是在传感器上检查属性,其中传感器值更改不是纯粹由事件驱动的,或者事件没有提供所需的粒度。 可以在 加速计示例中看到这一点。

DispatcherTimer 的其他方案包括检查没有相关事件的状态更改,或者检查无法使用情节提要动画或双向绑定的定期 UI 更新。

提示

如果要迁移 Microsoft Silverlight 或Windows Presentation Foundation (WPF) 代码,则 DispatcherTimer 和相关 Dispatcher 位于单独的 System.Windows.Threading 命名空间中。 Windows 运行时中没有 Windows.UI.Xaml.Threading 命名空间,因此此类位于 Windows.UI.Xaml 中。

如果不对 Tick 处理程序中的 UI 线程执行任何操作,并且只需要计时器,也可以改用 ThreadPoolTimer 。 此外,对于 ThreadPoolTimer 或 .NET 任务等技术,并不完全与 UI 线程隔离。 你仍然可以使用 CoreDispatcher.RunAsync 以异步方式分配给 UI 线程。

构造函数

DispatcherTimer()

初始化 DispatcherTimer 类的新实例。

属性

Interval

获取或设置计时器计时周期之间的时间。

IsEnabled

获取一个值,该值指示计时器是否正在运行。

方法

Start()

启动 DispatcherTimer

Stop()

停止 DispatcherTimer

事件

Tick

超过计时器间隔时发生。

适用于

另请参阅