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

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

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

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

РЕДАКТИРОВАТЬ: Это произошло снова, поэтому на этот раз, когда я попытался взломать отладчик, я выбрал «показать дизассемблирование». Это приводит меня к MS.Win32.UnsafeNativeMethods.GetMessageW. Трассировка стека выглядит следующим образом:

[Managed to Native Transition]  

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


person palehorse    schedule 19.09.2008    source источник


Ответы (5)


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

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

person Bob King    schedule 19.09.2008
comment
Просто примечание для других людей, которые будут читать это в будущем: Никогда не вызывайте () или BeginInvoke () длительные операции в вашем Dispatcher. Ваш пользовательский интерфейс будет зависать... используйте поток, BackgroundWorker или что-то подобное. - person palehorse; 19.09.2008
comment
Боб прав, если вы делаете слишком много в потоке пользовательского интерфейса за один раз, пользовательский интерфейс перестанет отвечать на запросы. Вы хотите делать как можно меньше в потоке пользовательского интерфейса; любые большие операции должны выполняться в фоновом потоке. - person Bob King; 19.09.2008
comment
Я не знал об этом средстве. В ближайшее время буду устанавливать - person Rob; 19.09.2008

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

person Alan Le    schedule 19.09.2008
comment
Snoop, вероятно, не поможет, так как код зависает, но вопрошающий не может взломать зависание. - person palehorse; 19.09.2008

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

person Rob    schedule 19.09.2008
comment
Я пробовал snoop, но, как заметил Боб, это не помогает. Я заметил еще одну вещь, которую я отредактирую в исходном вопросе. - person Bob King; 19.09.2008
comment
Мне это тоже нужно. У меня только что была точно такая же проблема. Я заметил ОГРОМНЫЙ прирост производительности, когда переключился на оконное приложение. - person palehorse; 19.09.2008

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

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

person palehorse    schedule 22.09.2008
comment
WindowsBase.dll!MS.Win32.UnsafeNativeMethods.GetMessageW(ref System.Windows.Interop.MSG msg, System.Runtime.InteropServices.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) + 0x15 байт
WindowsBase.dll!System.Windows .Threading.Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 байт WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading .DispatcherFrame frame = {System.Windows.Threading.DispatcherFrame}) + 0x8b байт WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame frame) + 0x49 байт
WindowsBase.dll! System.Windows.Threading.Dispatcher.Run() + 0x4c байт
PresentationFramework.dll!System.Windows.Application.RunDispatcher(игнорирование объекта) + 0x1e байт
PresentationFramework.dll!System.Windows.Application.RunInternal( Окно System.Windows.Window) + 0x6f байт PresentationFra mework.dll!System.Windows.Application.Run(окно System.Windows.Window) + 0x26 байт PresentationFramework.dll!System.Windows.Application.Run() + 0x19 байт WinterGreen.exe!WinterGreen.App.Main() + 0x5e байт C# [Переход от собственного к управляемому]
[Переход от управляемого к собственному]
mscorlib.dll!System.AppDomain.nExecuteAssembly(сборка System.Reflection.Assembly, string[] args) + 0x19 байт mscorlib.dll! System.Runtime.Hosting.ManifestRunner.Run(bool checkAptModel) + 0x6e байт mscorlib.dll!System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x84 байт mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System. ActivationContext activityContext, string[] активацияCustomData) + 0x65 байт mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activityContext) + 0xa байт mscorlib.dll!System.Activator.CreateInstance(System.ActivationContext activatio nContext) + 0x3e байт
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x23 байт
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(состояние объекта) + 0x66 байт
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executeContext, обратный вызов System.Threading.ContextCallback, состояние объекта) + 0x6f байт
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart() + 0x44 байта - person EightyOne Unite; 15.12.2009

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

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

person EightyOne Unite    schedule 15.12.2009