Оптимизация диспетчера пользовательского интерфейса C # UWP (Windows IoT Core) - PullRequest
0 голосов
/ 14 апреля 2019

В моем приложении (на Dragonboard 410c) у меня есть ThreadPoolTimer. Внутри Tick-Event много работы, большая часть для обработки данных и обновления пользовательского интерфейса. Поэтому я добавил диспетчера внутри Tick-Event и обработал всю работу там. Поскольку Tick-Event вызывается каждую секунду (это нужно для обновления часов в пользовательском интерфейсе), некоторые анимации пользовательского интерфейса немного запаздывают каждую секунду. Как только я уберу опцию обновления часов в интерфейсе, все анимации будут работать плавно.

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)
    });

Таким образом, вопрос в том, является ли правильным подход использовать только один диспетчер и добавлять туда каждый связанный код, или я должен использовать диспетчер внутри каждого вызываемого метода / задачи для лучшей оптимизации?

1 Ответ

2 голосов
/ 14 апреля 2019

Таким образом, вопрос в том, является ли правильным подход использовать только один диспетчер и добавлять в него каждый связанный код, или я должен использовать диспетчер внутри каждого вызываемого метода / задачи для лучшей оптимизации?

В идеале вы хотите запускать только связанный с пользовательским интерфейсом код в потоке диспетчера / пользовательского интерфейса.Это может увеличить сложность, поэтому есть компромисс.Обычно вам будет хорошо, если вы отделите тяжелый код обработки (которому не нужен поток пользовательского интерфейса) от кода пользовательского интерфейса и поместите его вне метода Dispatcher.RunAsync, сведя к минимуму работу в потоке пользовательского интерфейса, чтобы пользовательский интерфейс стал более отзывчивым.

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