WPF 调度程序 - 突然"stuck"并且不处理操作,直到我按下某个键



我们在 WPF 应用中遇到了一个非常奇怪的问题。

在启动时,我们的应用程序会触发一些服务请求。然后,当窗口加载时没有响应,直到我们按下一个键。CPU 使用率为 0%。

它看起来像一个 UI 死锁,虽然不是真正的死锁 - 我们可以调整它的大小并移动它。附加调试器时,我们看到主线程位于 Win32.UnsafeNativeMethods.GetMessageW 上 - 它不会像您通常在此类问题中看到的那样等待锁定。

然后,如果我们按下一个键,它将继续处理我们传递给 Dispatcher.BeginInvoke 的操作。

这在调试和发布版本中都会发生,但仅当它由 MSBuild 工具生成时。如果我在 VS2010 和 VS2012 的 PC 上构建应用程序(两者都面向 .NET 4.0),则问题永远不会发生。

关于如何识别阻止调度程序在按下键之前执行操作的任何想法?

问候。

PS - 请参阅下面的 UI 线程堆栈跟踪。

WindowsBase.dll!MS.Win32.UnsafeNativeMethods.GetMessageW(ref System.Windows.Interop.MSG msg, System.Runtime.InteropServices.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) + 0x14 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x80 字节 WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame) + 0x75 字节
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame frame) + 0x49 字节
WindowsBase.dll!System.Windows.Threading.Dispatcher.Run() + 0x4b 字节
演示框架.dll!System.Windows.Application.RunDispatcher(对象忽略)+ 0x17字节
演示框架.dll!System.Windows.Application.RunInternal(System.Windows.Window window) + 0x6f 字节 演示框架.dll!System.Windows.Application.Run(System.Windows.Window window) + 0x26 字节 演示框架.dll!System.Windows.Application.Run() + 0x1b 字节 MyApp.App.Main() 行 50 + 0xa 字节

这是一个很长的机会,但是,这可能是由于.Net 4.0中修复的.Net 4.0中可能存在的错误。您是否在 Jenkins 构建机器上进行测试以及编译?

我遇到过一些发生此类问题的事件(所有内容都在开发和构建计算机上编译,但运行时异常发生在测试计算机上的核心框架中,而在开发计算机上不会发生)。

在这些情况下,问题的根源在于,在面向.Net 4.0时,.Net 4.0的程序集在安装.Net 4.5/4.5.1时被覆盖(作为VS2012的一部分),因此,虽然源代码相同,但行为已更改,因此,在具有VS2012的计算机上一切似乎都正常,但在只有VS2010和/或 only.Net 4.0的计算机上则不行。

作为建议,请尝试使用 VS2012(仍面向 .Net 4.0)进行构建,然后在仅具有 .Net 4.0 的计算机上运行输出应用程序,然后在安装了 .Net 4.5 的计算机上运行输出应用程序。如果在 .Net 4.5 计算机上一切正常,但在 .Net 4.0 计算机上没有正常,则这可能是问题所在。

正如我所说,这是在黑暗中刺伤,那里可能存在真正的程序问题,但值得将其作为起点。

当然,如果允许您在应用程序中安装 .Net 4.5,这很好。如果没有,您可能需要找到解决问题的编程解决方法。

最新更新