我正在开发一个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(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(对象忽略)+ 0x1e字节
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字节 WinterGreen.exe!WinterGreen.App.Main()+ 0x5e bytes C# [原产于管理过渡]
[管理到原生过渡]
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(对象状态)+ 0x66字节
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
答案 0 :(得分:6)
由于性能问题,您的WPF应用可能会挂起。尝试使用Perforator查看您是否有任何软件渲染的部件,或者您的应用是否使用了太多的视频RAM。
答案 1 :(得分:5)
尝试删除窗口的无边界行为,看看是否有帮助。你也可以在任何长时间运行的程序中使用BeginInvoke()或Invoke()吗?
要看的另一件事:当你闯入代码时,尝试查看主线程以外的线程。其中一个可能阻止了UI线程。
答案 2 :(得分:4)
一个很棒的工具是Snoop。非常适合查看在给定时间在可视树上显示的WPF对象。我不确定它会有多大帮助,但是你可能会因为需要做很多额外的事情而干扰UI线程。 Snoop可以帮助您追踪屏幕上的内容,让您了解要查找的内容。
答案 3 :(得分:4)
我已经删除了Bob King建议的无边界行为。到目前为止,这似乎摆脱了这个问题。
现在的问题是,为什么以及如何解决这个问题?该产品设计为没有边框,有一些圆角和透明部分。
答案 4 :(得分:1)
Hurray,......似乎问题与无边框窗口无关(至少在我的情况下)。
将AllowsTransparency
设置为true时会有很大的性能影响。看起来很重要,整个事情可以挂起UI线程。非常奇怪的行为。可能与this ticket