【问题标题】:What could be reasons a WPF app would pin the CPU and lock the app on some computers but not others?WPF 应用程序会固定 CPU 并将应用程序锁定在某些计算机上而不是其他计算机上的原因可能是什么?
【发布时间】:2012-01-27 03:24:20
【问题描述】:

在这里难住了。之前发过类似的问题。我们有一个相当大的 WPF 应用程序,它在某些机器上运行良好,但在其他机器上,突然之间,其中一个 CPU 内核被固定为 100%(只有一个内核)并且应用程序冻结。它通常在显示上下文菜单或组合框下拉菜单(即弹出控件)时发生,这就是为什么我们无法调试它,因为当时没有用户代码正在执行。这让我们发疯了,因为在大多数机器上它运行良好,但在少数机器上它会死机。

奇怪的是,当我们在 VM 中运行它时,它也运行得很好!疯狂的!不知道是什么原因造成的,或者更重要的是,甚至不知道从哪里开始看,因为正如我所说,没有用户代码正在运行。

这种情况仅发生在我们大约 10% 的机器上,但在这些机器上始终会发生。全部都是干净的(即相对较新的操作系统安装,没有疯狂的应用程序等)并且在规格方面大多相同的机器:相似的 CPU、相似的 RAM、相同的视频驱动程序和服务包。

因此,正如我在标题中所述,任何人都可以提出 WPF 应用程序会固定 CPU 并将应用程序锁定在某些计算机上而不是其他计算机上的可能原因吗?我们只是被难住了!

【问题讨论】:

  • 在 xaml 或代码后面或两者中定义的上下文菜单?也许显示一些代码。组合框的同样问题。您是否尝试过非常简单的上下文菜单/组合框?并且由于两者都是弹出窗口,您是否尝试仅显示弹出窗口以查看这是否是核心问题?可能与图形卡/图形驱动程序相关,因为在 VM 图形管理更改时,但你说这两个图形设置是相同的......也许(再次看看问题来自哪里)尝试强制软件渲染。
  • 没有可显示的代码。带有一些附加命令的简单标准上下文菜单。检查了“CanExecute”处理程序,那里也没有什么奇怪的事情发生。此外,它们不存在组合框。顺便说一句,我纯粹是在猜测弹出窗口,但这似乎是一件常见的事情。尽管如此,再次发生这种情况时,一切都会冻结,即使是 VS。如果这是一个代码问题,我应该仍然能够闯入它。这也不是 VS 问题,因为安装的应用程序也会发生这种情况,但找不到 VS。发生在我们大约 5-10% 的机器上,但始终存在。
  • WPF Performance Suite 有一些工具可以帮助您找出问题的根源。
  • 我们实际上拥有 Red Gate 性能套件,据我了解,这是一个很大的进步,但即使是他们的支持人员也表示他们可以帮助分析代码以及分析性能和内存泄漏,但是代码挂在了甚至用户代码都没有的地方,这真的很痛苦。我们甚至尝试在 VS 中使用 MS 的源代码选项来进入他们的代码以查看发生了什么,但仍然没有骰子。
  • 上下文菜单下的图形有多“重”?我有一个应用程序,其中包含大量图像、视频和半透明渐变和反射。它在某些机器上表现不佳。最后我发现使用渐变 alpha 的反射速度大大减慢。

标签: wpf multithreading


【解决方案1】:

找到了!!事实证明 .NET 4.0 中存在一个关于 UI 自动化和 MS 引入的更改的错误。这是信息和修复! (注意:即使你打电话给 MS,他们也会给你发一个链接,但它总是一个断开的链接。我设法手动追踪了这个。)

注意:他们的文章讨论了导致此行为的特定案例,但如果您四处搜索,您会发现与这些 DLL 相关的大量挂起问题。最新的是他们承诺在 .NET 4.5 运行时中进行修复(来自 MS 关于此问题的帖子。)

这是知识库文章...
http://support.microsoft.com/kb/2484841/en-us

...这是实际的修补程序。
http://archive.msdn.microsoft.com/KB2484841/Release/ProjectReleases.aspx?ReleaseId=5583

【讨论】:

  • 两个死链接。 :-(
  • 尝试谷歌搜索知识库本身:microsoft kb 2484841
【解决方案2】:

糟糕的视频驱动程序?拉两台机器——一台在发生的地方,一台在没有发生的地方,然后开始分析差异。可能是硬件缺陷、坏的视频驱动程序,以及该区域的任何东西。 WPF 使用 GPU 进行渲染(如果有的话)。

【讨论】:

  • 是的,正如我上面所说,我们已经尝试过了。即使在几乎相同的笔记本电脑上,我相信甚至显卡都是完全相同的,我们甚至重新安装了相同的驱动程序以防万一,它仍然发生在一个而不是另一个上。我们真的被难住了。
【解决方案3】:

由于您似乎缺乏选择,我建议您在 Window 中仅使用最基本的 ComboBox 创建一个新项目,几乎什么都不做。这应该有效(检查:-))。然后在 ComboBox 中一一添加功能并进行测试,例如添加命令时,从空的开始。这样做直到它“中断”。所以你知道哪个功能是罪魁祸首。
你没有说是否一切都在使用软件渲染。

【讨论】:

  • 渲染没问题。这个应用程序是由一个 20 人的团队在三年内创建的。我们正准备发布。即使按照你所说的做相反的事情,也需要数周甚至数月的时间。这个应用程序发生了很多事情……主要是处理器密集型,而不是 UI 密集型。尽管如此,该应用程序还是很活泼,然后您右键单击某些东西,然后砰!墙。
  • 我了解到您的应用程序很大。但是对于测试测试,我建议不需要质量代码/源代码控制/......做简单的文件复制/剪切-粘贴直到错误显示肯定不需要几个月或几周。另一个类似的想法可能是在您的应用程序中一点一点(从零开始)填充一个 ComboBox,使用具有相同界面但“无所事事”的模型类,并将功能一个一个地连接到“真实”的功能。可以通过界面中的复选框列表一一启用或不启用此映射。
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2012-04-07
  • 2016-01-12
相关资源
最近更新 更多