C#UWP UI调度程序优化(Windows IoT核心)

问题描述 投票:0回答:1

在我的应用程序(在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# uwp dispatcher windowsiot windows-iot-core-10
1个回答
2
投票

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

理想情况下,您希望在调度程序/ 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.
    // ....
}
© www.soinside.com 2019 - 2024. All rights reserved.