WPF Dispatcher - 突然“卡住”,直到我按下一个键才处理动作

Alb*_*rto 6 wpf multithreading deadlock dispatcher

我们在 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 字节
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 帧) + 0x49 字节
WindowsBase.dll!System.Windows.Threading.Dispatcher.Run() + 0x4b 字节
PresentationFramework.dll!System.Windows.Application.RunDispatcher(对象忽略) + 0x17 字节
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() + 0x1b bytes MyApp.App.Main() Line 50 + 0xa bytes

小智 1

这是一个不太可能的情况,但是,这可能是由于 .Net 4.0 中可能存在的错误在 .Net 4.5 中得到了修复。您是否在 Jenkins 构建机器上进行测试并进行编译?

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

在这些情况下,问题的根源在于,虽然以 .Net 4.0 为目标,但安装 .Net 4.5/4.5.1(作为 VS2012 的一部分)时,.Net 4.0 的程序集会被覆盖,因此虽然源代码是相同的,行为已经改变,因此,在装有 VS2012 的机器上一切似乎都正常,但在仅装有 VS2010 和/或仅 .Net 4.0 的机器上则不然。

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

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

当然,如果允许您在应用程序中安装 .Net 4.5,那就没问题了。如果没有,您可能必须找到解决该问题的编程方法。