【问题标题】:How do you troubleshoot WPF UI problems?您如何解决 WPF UI 问题?
【发布时间】:2010-09-11 09:05:50
【问题描述】:

我正在开发一个 WPF 应用程序,该应用程序有时会出现奇怪的问题并在 UI 中出现挂起。它是不一致的,它发生在不同的页面中,但它经常发生,这是一个大问题。我应该提一下,这不是真正的挂起,如下所述。

我的第一个想法是某些按钮的动画是问题所在,因为它们在大多数页面上都使用过,但是在删除它们后仍然会出现挂起,尽管看起来不太常见。发生挂起时,我试图闯入调试器;但是从来没有任何代码可以查看。我的代码没有运行。我还注意到“挂起”并不完整。我有代码可以让我拖动表单(它没有边框或标题),它可以继续工作。我也有我赢得的关闭按钮,当我点击它时它会起作用。在我的代码运行时,单击按钮似乎确实有效,但 UI 根本不会更新以显示新页面。

我正在寻找任何建议、工具或技术来追踪这个奇怪的问题,所以如果您有任何想法,我将不胜感激。

编辑:它又发生了,所以这次当我试图闯入调试器时,我选择了“显示反汇编”。它把我带到了 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 字节
WindowsBase.dll!System.Windows.Threading.Dispatcher.GetMessage(参考 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 帧) + 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 字节 PresentationFramework.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 activationContext, string[] activationCustomData) + 0x65 字节 mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext) + 0xa 字节 mscorlib.dll!System.Activator.CreateInstance(System.ActivationContext activationContext) + 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 executionContext, System.Threading.ContextCallback 回调, 对象状态) + 0x6f 字节
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 字节

【问题讨论】:

    标签: wpf debugging user-interface xaml


    【解决方案1】:

    尝试删除窗口的无边框行为,看看是否有帮助。另外,您是否正在 BeginInvoke()'ing 或 Invoke()'ing 任何长时间运行的操作?

    另一件要注意的事情:当您闯入代码时,请尝试查看除主线程之外的线程。其中之一可能阻塞了 UI 线程。

    【讨论】:

    • 有时会执行一些异步进程;但是,此行为可能随时发生,包括在启动后几乎没有运行任何内容时。我将尝试删除无边界行为。
    • 只是给以后阅读本文的其他人的注释:永远不要在您的 Dispatcher 上执行 Invoke() 或 BeginInvoke() 长时间运行的操作。您的 UI 似乎会挂起...使用线程或 BackgroundWorker 或类似的东西。
    • Bob 是对的,如果您一次在 UI 线程上做的太多,UI 将变得无响应。你想在 UI 线程上做的越少越好;任何大的操作都应该在后台线程上完成。
    【解决方案2】:

    您的 WPF 应用程序可能由于性能问题而挂起。尝试使用Perforator 来查看您是否有任何软件渲染的部分,或者您的应用是否使用了过多的视频内存。

    【讨论】:

    • 我不知道那个工具。我很快就会安装它,
    【解决方案3】:

    一个很棒的工具是Snoop。非常适合查看在给定时间在可视化树上显示的 WPF 对象。我不确定它会有多大帮助,但你可能会因为它必须做的很多额外的事情而干扰 UI 线程。 Snoop 可以帮助您追踪屏幕上的内容,让您了解要查找的内容。

    【讨论】:

    • Snoop 可能无济于事,因为代码挂起,但提问者无法进入挂起状态。
    • 我试过 snoop,但正如 Bob 所说,它没有帮助。我注意到另一件事,我将编辑原始问题以包括在内。
    【解决方案4】:

    我已按照 Bob King 的建议删除了无边界行为。到目前为止,这似乎已经解决了这个问题。

    现在的问题是,为什么以及如何解决这个问题?产品设计为无边框,带有一些圆角和透明部分。

    【讨论】:

    • 我也需要这个。我刚刚遇到了完全相同的问题。当我切换到窗口应用程序时,我也注意到了巨大的性能提升。
    【解决方案5】:

    万岁,...看来问题与无边框窗口无关(至少在我的情况下)。

    当您将AllowsTransparency 设置为true 时,性能会受到很大影响。看起来很受欢迎,整个事情都可以挂起 UI 线程。非常奇怪的行为。可能与this ticket有关

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 2017-11-13
      • 2020-12-29
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      相关资源
      最近更新 更多