Как проанализировать UWP приложения, заморозить интерфейс? - PullRequest
0 голосов
/ 21 января 2020

Мое приложение UWP иногда переходит в состояние зависания пользовательского интерфейса, и я не знаю почему. Я проверил код модели представления и асинхронных вызовов c -wait. И я пытался использовать инструмент профиля производительности в Visual Studio, чтобы получить временную шкалу, но он показывает только время и продолжительность времени зависания пользовательского интерфейса. У меня закончились идеи.

Я попробовал dotTrace, но мне кажется, что я не могу использовать его для профилирования приложения UWP. Даже я "отключаю опцию Компилировать с помощью. NET Собственная цепочка инструментов в Visual Studio (через меню Project | Properties ... | Build) и перестраиваю проект". https://docs.microsoft.com/en-gb/visualstudio/profiling/profiling-feature-tour?view=vs-2019

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Я бы посоветовал вам попробовать использовать отладчик Visual Studio, чтобы выяснить, что делает код.

Сначала убедитесь, что у вас установлен режим «Отладка» и что отладчик будет работать «Локальный компьютер» (здесь есть и другие варианты, но я стараюсь упростить задачу).

Visual Studio debug buttons

Затем нажмите «Локальный» Кнопка «Машина» для запуска вашего приложения с помощью отладчика.

После того, как ваше приложение зависнет, нажмите «Отладка-разрыв всех»:

Debug Break All

После этого я предлагаю вам использовать различные команды Debug для дальнейшей отладки вашего приложения.

Debug menu items

Например, вы можете использовать пункт меню / стек вызовов для просмотра того, что делает ваш код. Вы также можете использовать меню «Потоки», чтобы увидеть, какие потоки работают. Если в вашем коде есть подозрительные области, вы можете рассмотреть возможность добавления операторов System.Diagnostics.Debug.WriteLine () для распечатки информационных сообщений, а затем использовать пункт / окно меню «Вывод», чтобы увидеть, что происходит.

Если ваше приложение сначала зависает, а затем через некоторое время вылетает, это может быть связано с тем, что в ваших задачах нет правильной обработки исключений. Возможно, вы захотите добавить обработчик UnobservedTaskException в свой код, чтобы помочь вам найти эту проблему.

0 голосов
/ 21 января 2020

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

Большинство из них происходят при обработке асинхронных методов и визуализации пользовательского интерфейса.

  1. При вызове асинхронных методов используйте ключевые слова async / await, например:
//define
public async Task asyncMethod()
{ }

//use
await asyncMethod();
Сокращение потребления ресурсов при рендеринге большого количества шаблонов данных с помощью виртуализация .

Если у вас большой список для рендеринга, если виртуализация не включена (имеется в виду элементы управления с виртуализацией, такой как ListView), или используется, но условия виртуализации разрушаются (например, добавление ScrollViewer за пределами ListView), это также приведет к зависанию интерфейса пользователя и не вернется к нормальному состоянию до тех пор, пока список

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

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...