11

我正在开发一个 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 bytes
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 帧= {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 window) + 0x26 bytes PresentationFramework.dll!System.Windows.Application.Run() + 0x19 bytes WinterGreen.exe!WinterGreen.App.Main() + 0x5e bytes C# [Native to Managed Transition]
[管理到本地转换]
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 字节

4

5 回答 5

6

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

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

于 2008-09-19T18:21:30.417 回答
6

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

于 2008-09-19T18:26:48.127 回答
4

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

于 2008-09-19T18:21:39.777 回答
4

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

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

于 2008-09-22T17:12:31.260 回答
1

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

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

于 2009-12-15T15:41:06.693 回答