Я работаю над приложением 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





Попробуйте убрать безграничное поведение вашего окна и посмотрите, поможет ли это. Кроме того, выполняете ли вы BeginInvoke () или Invoke () какие-либо длительные операции?
Еще одна вещь, на которую стоит обратить внимание: когда вы вторгаетесь в свой код, попробуйте посмотреть на потоки, отличные от основного. Один из них может блокировать поток пользовательского интерфейса.
Просто примечание для других людей, читающих это в будущем: никогда не вызывайте длительные операции Invoke () или BeginInvoke () на вашем Dispatcher. Ваш пользовательский интерфейс будет зависать ... используйте поток, BackgroundWorker или что-то подобное.
Боб прав, если вы слишком много делаете в потоке пользовательского интерфейса за один раз, пользовательский интерфейс перестанет отвечать. Вы хотите как можно меньше делать в потоке пользовательского интерфейса; любые большие операции должны выполняться в фоновом потоке.
Один отличный инструмент - Snoop. Действительно приятно смотреть, какие объекты WPF отображаются в визуальном дереве в данный момент. Я не уверен, насколько это поможет, но возможно, вы забиваете поток пользовательского интерфейса множеством дополнительных вещей, которые он должен сделать. Snoop может помочь вам отследить, что находится на экране, чтобы дать вам представление о том, что искать.
Snoop, вероятно, не поможет, так как код зависает, но спрашивающий не может взломать зависание.
Я пробовал snoop, но, как заметил Боб, это не помогает. Я заметил еще одну вещь, которую я отредактирую и включу в исходный вопрос.
Ваше приложение WPF может зависать из-за проблем с производительностью. Попробуйте использовать Перфоратор, чтобы увидеть, есть ли у вас какие-либо части, которые визуализируются программно, или ваше приложение использует слишком много видеопамяти.
Я не знал об этом инструменте. Я скоро установлю его,
Я удалил поведение без границ, как было предложено Бобом Кингом. На сегодняшний день, похоже, проблема решена.
Теперь вопрос в том, почему и как я могу решить эту проблему? Изделие разработано так, чтобы не было границ с закругленными углами и прозрачными частями.
Мне это тоже нужно. У меня была точно такая же проблема. Я заметил МАССИВНЫЙ прирост производительности, когда я тоже переключился на оконное приложение.
Ура, ... похоже, проблема не в окнах без полей (по крайней мере, в моем случае).
Если установить AllowsTransparency в значение true, это сильно снизит производительность. Может показаться, что все это может повесить поток пользовательского интерфейса. Очень странное поведение. Может быть связано с этот билет
Бывают случаи, когда выполняется какой-то асинхронный процесс; однако это может произойти в любое время, в том числе сразу после запуска, когда почти ничего не запускалось. Я попробую убрать безграничное поведение.