Как вы устраняете проблемы с пользовательским интерфейсом WPF?

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

Моя первая мысль заключалась в том, что анимация некоторых кнопок была проблемой, поскольку они используются на большинстве страниц, но после их удаления зависания все еще происходят, хотя, по-видимому, немного реже. Я попытался взломать отладчик при зависании; однако никакого кода для просмотра нет. Мой код не запущен. Еще заметил, что "зависание" не полное. У меня есть код, который позволяет мне перетаскивать форму (у нее нет рамки или заголовка), которая продолжает работать. У меня также есть моя выигранная кнопка закрытия, которая срабатывает, когда я нажимаю на нее. Кажется, что нажатие на кнопки действительно работает во время выполнения моего кода, но пользовательский интерфейс просто никогда не обновляется, чтобы показать новую страницу.

Я ищу любые советы, инструменты или методы, чтобы отследить эту странную проблему, поэтому, если у вас есть какие-либо мысли, я буду очень признателен.

Обновлено: Это случилось снова, поэтому на этот раз, когда я попытался взломать отладчик, я решил «показать разборку». Это подводит меня к MS.Win32.UnsafeNativeMethods.GetMessageW. Трассировка стека следует:

[Managed to Native Transition]  

WindowsBase.dll!MS.Win32.UnsafeNativeMethods.GetMessageW(ref System.Windows.Interop.MSG msg, System.Runtime.InteropServices.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) + 0x15 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 bytes WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame = {System.Windows.Threading.DispatcherFrame}) + 0x8b bytes WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame frame) + 0x49 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.Run() + 0x4c bytes
PresentationFramework.dll!System.Windows.Application.RunDispatcher(object ignore) + 0x1e bytes
PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window window) + 0x6f bytes PresentationFramework.dll!System.Windows.Application.Run(System.Windows.Window window) + 0x26 bytes PresentationFramework.dll!System.Windows.Application.Run() + 0x19 bytes WinterGreen.exe!WinterGreen.App.Main() + 0x5e bytes C# [Native to Managed Transition]
[Managed to Native Transition]
mscorlib.dll!System.AppDomain.nExecuteAssembly(System.Reflection.Assembly assembly, string[] args) + 0x19 bytes mscorlib.dll!System.Runtime.Hosting.ManifestRunner.Run(bool checkAptModel) + 0x6e bytes mscorlib.dll!System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x84 bytes mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext, string[] activationCustomData) + 0x65 bytes mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext) + 0xa bytes mscorlib.dll!System.Activator.CreateInstance(System.ActivationContext activationContext) + 0x3e bytes
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x23 bytes
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x66 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x6f bytes
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
0
5 904
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Попробуйте убрать безграничное поведение вашего окна и посмотрите, поможет ли это. Кроме того, выполняете ли вы BeginInvoke () или Invoke () какие-либо длительные операции?

Еще одна вещь, на которую стоит обратить внимание: когда вы вторгаетесь в свой код, попробуйте посмотреть на потоки, отличные от основного. Один из них может блокировать поток пользовательского интерфейса.

Бывают случаи, когда выполняется какой-то асинхронный процесс; однако это может произойти в любое время, в том числе сразу после запуска, когда почти ничего не запускалось. Я попробую убрать безграничное поведение.

palehorse 19.09.2008 22:23

Просто примечание для других людей, читающих это в будущем: никогда не вызывайте длительные операции Invoke () или BeginInvoke () на вашем Dispatcher. Ваш пользовательский интерфейс будет зависать ... используйте поток, BackgroundWorker или что-то подобное.

Bob King 19.09.2008 22:25

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

Rob 19.09.2008 22:28

Один отличный инструмент - Snoop. Действительно приятно смотреть, какие объекты WPF отображаются в визуальном дереве в данный момент. Я не уверен, насколько это поможет, но возможно, вы забиваете поток пользовательского интерфейса множеством дополнительных вещей, которые он должен сделать. Snoop может помочь вам отследить, что находится на экране, чтобы дать вам представление о том, что искать.

Snoop, вероятно, не поможет, так как код зависает, но спрашивающий не может взломать зависание.

Bob King 19.09.2008 22:23

Я пробовал snoop, но, как заметил Боб, это не помогает. Я заметил еще одну вещь, которую я отредактирую и включу в исходный вопрос.

palehorse 19.09.2008 22:24

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

Я не знал об этом инструменте. Я скоро установлю его,

palehorse 19.09.2008 22:57

Я удалил поведение без границ, как было предложено Бобом Кингом. На сегодняшний день, похоже, проблема решена.

Теперь вопрос в том, почему и как я могу решить эту проблему? Изделие разработано так, чтобы не было границ с закругленными углами и прозрачными частями.

Мне это тоже нужно. У меня была точно такая же проблема. Я заметил МАССИВНЫЙ прирост производительности, когда я тоже переключился на оконное приложение.

EightyOne Unite 15.12.2009 17:39

Ура, ... похоже, проблема не в окнах без полей (по крайней мере, в моем случае).

Если установить AllowsTransparency в значение true, это сильно снизит производительность. Может показаться, что все это может повесить поток пользовательского интерфейса. Очень странное поведение. Может быть связано с этот билет

Другие вопросы по теме