首页 > 解决方案 > C# UWP UI 调度程序优化(Windows IoT Core)

问题描述

在我的应用程序中(在 Dragonboard 410c 上)我有一个 ThreadPoolTimer。Tick-Event 内部有很多工作要做,大部分工作是处理数据和更新 UI。所以我在 Tick-Event 中添加了一个调度程序并在那里处理所有工作。由于 Tick-Event 每秒调用一次(需要这个来更新 UI 上的时钟),一些 UI 动画每秒有点滞后。一旦我删除了在 UI 上更新时钟的选项,所有动画都运行流畅。

private async void clock_Tick(ThreadPoolTimer timer)
{
    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    () =>
    {
        textBlockClock.Text = DateTime.Now.ToString("HH:mm");
        textBlockWeekDay.Text = DateTime.Now.ToString("dddd", cultureInfo);
        textBlockDate.Text = DateTime.Now.ToString("dd.MM.yyyy");

        // Do more work (call multiple methods and tasks)
    });

所以问题是,只使用一个调度程序并在其中添加所有相关代码是正确的方法,还是应该在每个调用的方法/任务中使用调度程序以进行更好的优化?

标签: c#uwpdispatcherwindowsiotwindows-iot-core-10

解决方案


所以问题是,只使用一个调度程序并在其中添加所有相关代码是正确的方法,还是应该在每个调用的方法/任务中使用调度程序以进行更好的优化?

理想情况下,您只想在调度程序/UI 线程上运行与 UI 相关的代码。它可能会增加复杂性,因此需要权衡取舍。通常,如果您将繁重的处理代码(不需要 UI 线程)从 UI 代码中分离出来,并将其放在 Dispatcher.RunAsync 方法之外,从而最大限度地减少 UI 线程中的工作以保持 UI 更具响应性,那么您会很好。

private async void clock_Tick(ThreadPoolTimer timer)
{
    // Do some work.
    // ...
    // Update the UI.
    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    () => {
        textBlockClock.Text = clock;
        textBlockWeekDay.Text  weekday;
        textBlockDate.Text = date;
    });
    // Do more work.
    // ....
}

推荐阅读